我编写了一个包含不同算法的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的结果。例如。看一下标准高斯分布的图形表示。我指的是它,因为它可视化我想要以这种方式实现/使用的结果值的概率,如果你理解的话。
答案 0 :(得分:1)
正态分布就是这样(x
是随机统一数字):
但是我看到一些可能有问题的东西:
std::uniform_int_distribution<int> distribution(min, max);
这不是为您的号码生成器提供int
类型吗?
要解决播种问题,请在lambda之外创建引擎,并在创建它时将其播种。
RNG使用一种算法,该算法产生随机出现的数字,但具有非常大的重复周期(Mersenne Twister的一个亮点)。当你播种时,你给RNG一个初始值来开始这个过程。每当你要求另一个数字时,它会再次吐出算法的迭代次数。
当您为每次迭代播种时:
time(NULL)
此代码每秒只会更改一次,因此当您请求新的随机数时,它只会每秒更改一次。