1

我编写了一个包含不同算法的 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 的结果不应该像两者的平均值那样频繁地生成。例如,查看标准高斯分布的图形表示。我指的是它,因为它可视化了我想以这种方式实现/使用的结果值的概率,如果你理解的话。

4

1 回答 1

1

正态分布就是这样(x是一个随机的均匀数):

普通的

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

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

这不是给你的数字生成器一个int类型吗?


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

RNG 使用的算法生成的数字看起来是随机的,但重复周期非常长(Mersenne Twister 的一个亮点)。当你播种时,你给 RNG 一个初始值来开始这个过程。每次您要求另一个数字时,它都会产生算法的另一个迭代。

当您为每次迭代播种时:

time(NULL)

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

于 2011-10-01T21:45:23.197 回答