我将随机数生成器应用于我的代码,尽管当我第二次或第三次运行代码时,生成的第一个数字没有改变。然而,其他数字发生了变化,问题仅在于第一个值。我正在使用代码块;Cygwin GCC 编译器 (c++ 17)。利用时间播种。
#include <iostream>
#include <random>
#include <ctime>
int main()
{
std::default_random_engine randomGenerator(time(0));
std::uniform_int_distribution randomNumber(1, 20);
int a, b, c;
a = randomNumber(randomGenerator);
b = randomNumber(randomGenerator);
c = randomNumber(randomGenerator);
std::cout<<a<<std::endl;
std::cout<<b<<std::endl;
std::cout<<c<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当我第一次运行代码时,它可能会产生类似 a = 4、b = 5、c = 9 的结果。第二次和以后的时间 (a) 仍为 4,但 (b) 和 (c) 不断变化。
根据我的评论,这std::mt19937是您应该考虑的主要 PRNG。这是 中提供的最好的一个<random>。您还应该更好地播种它。这里我用的是std::random_device.
有些人会抱怨std::random_device当无法找到真正的随机数据源时如何回落到确定性种子,但这在低级嵌入式内容之外非常罕见。
#include <iostream>\n#include <random>\n\nint main() {\n std::mt19937 randomGenerator(std::random_device{}());\n std::uniform_int_distribution randomNumber(1, 20);\n\n for (int i = 0; i < 3; ++i) {\n std::cout << randomNumber(randomGenerator) << \' \';\n }\n std::cout << \'\\n\';\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n输出:
\n~/tmp \n\xe2\x9d\xaf ./a.out \n8 2 16 \n\n~/tmp \n\xe2\x9d\xaf ./a.out\n7 12 14 \n\n~/tmp \n\xe2\x9d\xaf ./a.out\n8 12 4 \n\n~/tmp \n\xe2\x9d\xaf ./a.out\n18 8 7\nRun Code Online (Sandbox Code Playgroud)\n在这里,我们看到四个非常不同的运行。由于您的范围很小,您会时不时地看到模式弹出。还有其他方面需要改进,特别是为 PRNG 提供更强大的种子,但对于玩具程序来说,这已经足够了。
\n