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