【问题标题】:rand() and a Mersenne Twister C++ implementationrand() 和 Mersenne Twister C++ 实现
【发布时间】:2013-10-13 18:34:29
【问题描述】:

我需要实现一个好的 RNG,我想 Mersenne Twister 可能对我有好处。 我在任何地方都没有找到一个有效的 C++ 实现,我是一个糟糕的谷歌搜索者还是真的不容易找到?! 我之前试过rand()

srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
     random =  rand();
     cout<<random;
}

我不知道为什么,但是随机变量总是相同的数字.....但是如果我添加一个Sleep(1000),它就可以了!像这样:

srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
    random =  rand();
    cout<<random;
    Sleep(1000);
}

所以我决定尝试 Mersenne Twister...有人能找到解决方案吗(因为我需要找到非常多的随机数,所以我不能使用 Sleep(1000),这需要很长时间!)或帮助我实现 Mersenne Twister 或另一个好的 RNG。 感谢和抱歉我的英语不好......

【问题讨论】:

标签: c++ random


【解决方案1】:

Boost.Random 是一个可用的实现,如果您的 STL 实现没有它。

您可以使用random_device 获取随机种子,然后将其传递给mt19937 构造函数以初始化随机数生成器。
然后您可以使用uniform_int_distribution 获得一个随机整数,均匀分布在您在uniform_int_distribution 构造函数中指定的封闭范围[a, b]

您可能需要考虑这个示例代码(使用 g++ 4.8.1 编译):

#include <iostream>
#include <boost\nondet_random.hpp>
#include <boost\random.hpp>

int main() {        
    // Get a random seed
    boost::random_device rd;
    const auto seed = rd();

    // Marsenne Twister generator
    boost::random::mt19937 mt(seed);

    // Get random integers uniformly distributed in range [0, 99]
    boost::random::uniform_int_distribution<int> dist(0, 99);

    // Print 10 random numbers, uniformly distributed in previous range
    for (int i = 0; i < 10; ++i) {
        std::cout << dist(mt) << " ";
    }
    std::cout << std::endl;    
}

【讨论】:

    【解决方案2】:

    C++11 包含一个带有 random standard library header 的 mersenne twister。

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2011-01-28
      • 2010-12-19
      • 2016-01-06
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多