【发布时间】:2015-03-01 19:57:32
【问题描述】:
我有一小段代码运行 Mersenne Twister PRNG,它运行良好:
std::random_device randDev;
std::mt19937 twister(randDev());
std::uniform_int_distribution<int> dist(0,99);
for (int i = 0; i < 10; i++) {
std::cout << dist(twister) << std::endl;
}
它输出十个随机数。但是,如果我将完全相同的代码放入函数中:
#include <random>
int getRand(const int& A, const int& B) {
std::random_device randDev;
std::mt19937 twister(randDev());
std::uniform_int_distribution<int> dist(A,B);
return dist(twister);
}
int main() {
for (int i = 0; i < 10; i++) {
std::cout << getRand(0,99) << std::endl;
}
return 0;
}
它输出相同的数字十次。我刚开始使用 C++,所以我不知道是什么原因造成的,也不知道如何解决这个问题。
编辑: 问题出在 std::random_device 上。它可能是 Eclipse C++ IDE(Luna 版本)或 MinGW 4.8.1 中的错误,但无论出于何种原因,随机数总是相同的。我相信 time(0) 将是适合我使用的种子。
编辑 2: 考虑到 T.C. 的建议以及 time(0) 仍然导致十个相同数字的事实,这是迄今为止的最终代码。我知道 rand() 不好,但它有效。
#include <iostream>
#include <random>
std::mt19937 twister(rand());
int getRand(const int& A, const int& B) {
std::uniform_int_distribution<int> dist(A,B);
return dist(twister);
}
int main() {
for (int i = 0; i < 10; i++) {
std::cout << getRand(0,99) << std::endl;
}
return 0;
}
【问题讨论】:
-
你用的是什么编译器?使用
g++-4.9对我来说效果很好。 -
在第一种情况下你总是得到相同的随机值序列吗?
-
我使用 MinGW,实际上现在我检查过,我确实得到了相同的十个随机数,每个随机数都使用第一个代码运行。
-
你不应该每次调用函数时都真正构造引擎。
标签: c++ c++11 mersenne-twister