C ++ RNG(Mersenne Twister)需要种子

时间:2011-10-01 21:23:22

标签: c++ random distribution seed mersenne-twister

我编写了一个包含不同算法的RNG类,但它没有按预期工作。除了我想要使用正常(而不是统一)分布的事实,我的代码总是返回相同的数字(最大)或只是间隔[min,max]中的2个数字:

std::function<int(int, int)> mt19937 =
    [](int min, int max) -> int {
        std::uniform_int_distribution<int> distribution(min, max);
        std::mt19937 engine;
        engine.seed(time(null));
        auto generator = std::bind(distribution, engine);
        return generator();
    };

任何人都能解释一下解决这个难题的缺失吗?此外,我如何实现正态分布?上次我试用std::normal_distribution我无法进入界限!

编辑:当我说正态分布时,我的意思是不应该像两者的平均值那样频繁地生成接近两个边界的RNG的结果。例如。看一下标准高斯分布的图形表示。我指的是它,因为它可视化我想要以这种方式实现/使用的结果值的概率,如果你理解的话。

1 个答案:

答案 0 :(得分:1)

正态分布就是这样(x是随机统一数字):

Normal

但是我看到一些可能有问题的东西:

std::uniform_int_distribution<int> distribution(min, max);

这不是为您的号码生成器提供int类型吗?


要解决播种问题,请在lambda之外创建引擎,并在创建它时将其播种。

RNG使用一种算法,该算法产生随机出现的数字,但具有非常大的重复周期(Mersenne Twister的一个亮点)。当你播种时,你给RNG一个初始值来开始这个过程。每当你要求另一个数字时,它会再次吐出算法的迭代次数。

当您为每次迭代播种时:

time(NULL)

此代码每秒只会更改一次,因此当您请求新的随机数时,它只会每秒更改一次。