我想找出可以在c ++中为随机数生成器播种的最大值。我的代码如下:
mt19937 myRandomGenerator(seed);
变量种子有多大?我注意到,如果值变得太大,随机数生成器会吐出相同的“随机”数字序列。我想知道如果没有这种情况,种子有多大。
答案 0 :(得分:3)
seed
是std::uint_fast32_t
,通常只是一个32位的int。范围[0..2^32)
中的每个值都应产生不同的结果。如果您从两个不同的种子值中看到相同的序列,那么您要么发出观察错误,要么输入的种子实际上是相同的,或者标准库实现中存在错误。
准备一个简短的独立测试程序,演示不当行为,并在此处发布。
答案 1 :(得分:2)
问题的措辞有点含糊不清。可以将问题读作询问此行为:
#include <random>
#include <iostream>
int
main()
{
std::mt19937 eng1(4294967296);
for (int i = 0; i < 10; ++i)
std::cout << eng1() << '\n';
std::cout << '\n';
std::mt19937 eng2(0);
for (int i = 0; i < 10; ++i)
std::cout << eng2() << '\n';
}
我的编译器会发出一个应该注意的警告:
test.cpp:7:23: warning: implicit conversion from 'long' to 'result_type' (aka 'unsigned int') changes value from 4294967296 to 0 [-Wconstant-conversion]
std::mt19937 eng1(4294967296);
~~~~ ^~~~~~~~~~
1 warning generated.
如果这是您所看到的,那是因为
static_cast<std::mt19937::result_type>(4294967296) == 0
如果这不是您要求的行为,请澄清您的问题。