0

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

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

我不知道为什么,但是随机变量总是相同的数字.....但是如果我添加 a 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。感谢和抱歉我的英语不好...

4

2 回答 2

7

C++11 包含一个带有random标准库头文件的 mersenne twister 。

于 2013-10-07T08:58:56.990 回答
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;    
}
于 2013-10-07T09:10:49.797 回答