我想找出我可以在 C++ 中播种随机数生成器的最大值。我的代码如下:
mt19937 myRandomGenerator(seed);
变量种子有多大?我注意到如果值变得太大,随机数生成器会吐出相同的“随机”数序列。我想知道如果不发生这种情况,种子可以有多大。
我想找出我可以在 C++ 中播种随机数生成器的最大值。我的代码如下:
mt19937 myRandomGenerator(seed);
变量种子有多大?我注意到如果值变得太大,随机数生成器会吐出相同的“随机”数序列。我想知道如果不发生这种情况,种子可以有多大。
seed
是std::uint_fast32_t
通常只是一个 32 位整数。范围内的每个值都[0..2^32)
应该产生不同的结果。如果您从两个不同的种子值中看到相同的序列,那么您要么犯了一个观察错误并且您输入的种子实际上是相同的,要么您的标准库实现中存在错误。
准备一个简短的独立测试程序来演示不当行为并将其发布在此处。
问题的措辞有些模棱两可。可以将问题阅读为询问此行为:
#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
如果这不是您要询问的行为,请澄清您的问题。