最大的种子可能为Mersenne Twister c ++

时间:2013-08-23 14:55:49

标签: c++ c++11 random mersenne-twister

我想找出可以在c ++中为随机数生成器播种的最大值。我的代码如下:

mt19937 myRandomGenerator(seed);

变量种子有多大?我注意到,如果值变得太大,随机数生成器会吐出相同的“随机”数字序列。我想知道如果没有这种情况,种子有多大。

2 个答案:

答案 0 :(得分:3)

seedstd::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

如果这不是您要求的行为,请澄清您的问题。