我将随机数生成器应用于我的代码,尽管当我第二次或第三次运行代码时生成的第一个数字没有改变。然而,其他数字发生变化,问题仅在于第一个值。我正在使用代码块; 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;
}
在这种情况下,当我第一次运行代码时,它可能会产生类似 a = 4、b = 5、c = 9 的结果。第二次和更长时间 (a) 仍然是 4,但 (b) 和 (c ) 不断变化。
最佳答案
根据我的评论, std::mt19937
是您应该考虑的主要 PRNG。这是<random>
中提供的最好的一个.你也应该播种更好。这里我用std::random_device
.
有些人会提示 std::random_device
当无法找到真正的随机数据源时,会回退到确定性种子,但在低级嵌入式内容之外这种情况非常罕见。
#include <iostream>
#include <random>
int main() {
std::mt19937 randomGenerator(std::random_device{}());
std::uniform_int_distribution randomNumber(1, 20);
for (int i = 0; i < 3; ++i) {
std::cout << randomNumber(randomGenerator) << ' ';
}
std::cout << '\n';
return 0;
}
输出:
~/tmp
❯ ./a.out
8 2 16
~/tmp
❯ ./a.out
7 12 14
~/tmp
❯ ./a.out
8 12 4
~/tmp
❯ ./a.out
18 8 7
在这里,我们看到四个截然不同的运行。因为你的范围很小,你会不时地看到模式弹出。还有其他方面的改进,特别是为 PRNG 提供了更强大的种子,但对于玩具程序来说,这就足够了。
https://stackoverflow.com/questions/73038129/