C++ mt19937 总是给出相同的数字,即使在播种时也是如此
C++ mt19937 always giving same number, even when seeding
我目前遇到一个问题,我的 RNG 总是给我相同的数字——即使我(据说)每次都在播种值。
class中的代码是:
int RandomNumberGenerator()
{
std::mt19937 engine;
auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
engine.seed((unsigned long)seed);
std::uniform_int_distribution<int> distribution(0, 100);
return distribution(engine);
}
调用它的代码是:
vector<int> iv;
generate_n(back_inserter(iv), 5, RandomNumberGenerator);
cout << "\nVector content: ";
copy(iv.begin(), iv.end(), ostream_iterator<int>(cout, " "));
当然每次 generate_n 函数
好吧,您创建了 n
个不同的引擎,并为它们设置了时钟值。很有可能时钟在 generate_n()
运行 时间没有移动,并且所有引擎都使用相同的值播种。
您应该为生成器播种一次并多次使用它。
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 100);
std::vector<int> vi;
std::generate_n(std::back_inserter(vi), 5, std::bind(dis, gen));
std::copy(begin(vi), end(vi), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
可以看到live
备注
Some people may say that your code was indeed returning random numbers:)
我目前遇到一个问题,我的 RNG 总是给我相同的数字——即使我(据说)每次都在播种值。
class中的代码是:
int RandomNumberGenerator()
{
std::mt19937 engine;
auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
engine.seed((unsigned long)seed);
std::uniform_int_distribution<int> distribution(0, 100);
return distribution(engine);
}
调用它的代码是:
vector<int> iv;
generate_n(back_inserter(iv), 5, RandomNumberGenerator);
cout << "\nVector content: ";
copy(iv.begin(), iv.end(), ostream_iterator<int>(cout, " "));
当然每次 generate_n 函数
好吧,您创建了 n
个不同的引擎,并为它们设置了时钟值。很有可能时钟在 generate_n()
运行 时间没有移动,并且所有引擎都使用相同的值播种。
您应该为生成器播种一次并多次使用它。
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 100);
std::vector<int> vi;
std::generate_n(std::back_inserter(vi), 5, std::bind(dis, gen));
std::copy(begin(vi), end(vi), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
可以看到live
备注
Some people may say that your code was indeed returning random numbers:)