第二次编译时更改随机生成数字的值

Mou*_*use 2 c++

我将随机数生成器应用于我的代码,尽管当我第二次或第三次运行代码时,生成的第一个数字没有改变。然而,其他数字发生了变化,问题仅在于第一个值。我正在使用代码块;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) 不断变化。

swe*_*ish 7

根据我的评论,这std::mt19937是您应该考虑的主要 PRNG。这是 中提供的最好的一个<random>。您还应该更好地播种它。这里我用的是std::random_device.

\n

有些人会抱怨std::random_device当无法找到真正的随机数据源时如何回落到确定性种子,但这在低级嵌入式内容之外非常罕见。

\n
#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}\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,我们看到四个非常不同的运行。由于您的范围很小,您会时不时地看到模式弹出。还有其他方面需要改进,特别是为 PRNG 提供更强大的种子,但对于玩具程序来说,这已经足够了。

\n