0

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

mt19937 myRandomGenerator(seed);

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

4

2 回答 2

3

seedstd::uint_fast32_t通常只是一个 32 位整数。范围内的每个值都[0..2^32)应该产生不同的结果。如果您从两个不同的种子值中看到相同的序列,那么您要么犯了一个观察错误并且您输入的种子实际上是相同的,要么您的标准库实现中存在错误。

准备一个简短的独立测试程序来演示不当行为并将其发布在此处。

于 2013-08-23T15:10:22.387 回答
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

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

于 2013-08-23T15:22:08.573 回答