rand()和Mersenne Twister C ++实现

时间:2013-10-07 08:54:23

标签: c++ random

我需要实施一个好的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。 谢谢,抱歉我的英语不好......

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

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

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

您可能需要考虑此示例代码(使用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;    
}