随机 ABCD 字符生成器
Random ABCD char generator
我正在制作一个问答游戏,当玩家打电话给他的朋友(这是一个简单的 cout)时,程序会打印一个随机字符的答案(A、B、C 或 D)和一个随机数到展示他有多确定(从 1 到 100)。无论我尝试什么,控制台中的字符始终是 D,数字始终是 87。我不知道如何使它工作。这是当前代码:
char x = *("ABCD" + rand() % 4);
int y = 1+ (rand() % 100);
随机数生成并不像您想象的那么简单。
在这里查看一些一般信息:Random number generation - Wikipedia.
为了正确使用rand
,您应该初始化随机种子(参见link)。
建议使用当前时间作为种子以获得“不错”的随机值。请注意,使用 srand
设置种子应仅调用一次。
下面您可以看到代码的固定版本,它在每个 运行:
中(可能)产生不同的值
#include <time.h>
#include <stdlib.h>
#include <iostream>
int main() {
// Call once:
srand(static_cast<unsigned int>(time(0)));
// Can be called multiple times:
char x = *("ABCD" + rand() % 4);
int y = 1 + (rand() % 100);
std::cout << x << "," << y << std::endl;
return 0;
}
但是 - 自 C++11 以来,标准库对随机生成器提供了良好且现代的支持。参见:Pseudo-random number generation.
它需要更多样板文件,但您可以更好地控制随机值的生成。在 <random>
header 中查看更多信息,其中包含大量 类 和实用程序。
在您的情况下 rand()
的一个很好的替代方法是 std::uniform_int_distribution
。
这里有一些信息为什么比旧的 rand()
更喜欢它:What are the advantages of using uniform_int_distribution vs a modulus operation?.
下面的代码显示了如何在您的情况下使用它(rd
、gen
、distrib1
、distrib2
的初始化应该只执行一次):
#include <random>
#include <iostream>
int main() {
// Call once:
std::random_device rd; // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib1(0, 3); // For getting a random integer in the range 0..3
std::uniform_int_distribution<> distrib2(1, 100); // For getting a random integer in the range 1..100
// Can be called multiple times:
char ABCD[] = "ABCD";
std::cout << ABCD[distrib1(gen)] << ',' << distrib2(gen) << std::endl;
return 0;
}
我正在制作一个问答游戏,当玩家打电话给他的朋友(这是一个简单的 cout)时,程序会打印一个随机字符的答案(A、B、C 或 D)和一个随机数到展示他有多确定(从 1 到 100)。无论我尝试什么,控制台中的字符始终是 D,数字始终是 87。我不知道如何使它工作。这是当前代码:
char x = *("ABCD" + rand() % 4);
int y = 1+ (rand() % 100);
随机数生成并不像您想象的那么简单。
在这里查看一些一般信息:Random number generation - Wikipedia.
为了正确使用rand
,您应该初始化随机种子(参见link)。
建议使用当前时间作为种子以获得“不错”的随机值。请注意,使用 srand
设置种子应仅调用一次。
下面您可以看到代码的固定版本,它在每个 运行:
中(可能)产生不同的值#include <time.h>
#include <stdlib.h>
#include <iostream>
int main() {
// Call once:
srand(static_cast<unsigned int>(time(0)));
// Can be called multiple times:
char x = *("ABCD" + rand() % 4);
int y = 1 + (rand() % 100);
std::cout << x << "," << y << std::endl;
return 0;
}
但是 - 自 C++11 以来,标准库对随机生成器提供了良好且现代的支持。参见:Pseudo-random number generation.
它需要更多样板文件,但您可以更好地控制随机值的生成。在 <random>
header 中查看更多信息,其中包含大量 类 和实用程序。
在您的情况下 rand()
的一个很好的替代方法是 std::uniform_int_distribution
。
这里有一些信息为什么比旧的 rand()
更喜欢它:What are the advantages of using uniform_int_distribution vs a modulus operation?.
下面的代码显示了如何在您的情况下使用它(rd
、gen
、distrib1
、distrib2
的初始化应该只执行一次):
#include <random>
#include <iostream>
int main() {
// Call once:
std::random_device rd; // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib1(0, 3); // For getting a random integer in the range 0..3
std::uniform_int_distribution<> distrib2(1, 100); // For getting a random integer in the range 1..100
// Can be called multiple times:
char ABCD[] = "ABCD";
std::cout << ABCD[distrib1(gen)] << ',' << distrib2(gen) << std::endl;
return 0;
}