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

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

最佳答案

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

Normal

但我看到了一些可能有问题的地方:

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

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


要解决播种问题,请在 lambda 之外创建您的引擎,并在创建时对其进行播种。

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

当您为每次迭代播种时:

time(NULL)

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

关于C++ RNG (Mersenne Twister) 需要种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623055/

相关文章:

c++ - 如何使用 cin 实现单行整数类型命令行输入验证?

c++ - GCC 7 C++ 17 对折叠表达式的支持

algorithm - 如何证明实验数据服从重尾分布?

python - 拟合 beta 分布(在 python 中)-请澄清

c++ - 生成具有较高出现频率的一些字母表的随机字母表(vc++6.0)

algorithm - 加权平均分配算法

C++内存分配问题

c++ - 在不明确的情况下使用限定 ID 访问类成员

c++ - 为什么人们说使用随机数生成器时存在模偏差?

javascript - HTML 中的随机视频生成器