下面的代码展示了如何在C ++ 11中随机加倍。在这个解决方案每一次,当我运行这个程序时,结果是一样的 - 我不知道为什么?如何更改它以在每次运行程序时获得不同的解决方案?
#include <random>
int main(int argc, char **argv)
{
double lower_bound = 0.;
double upper_bound = 1.;
std::uniform_real_distribution<double> unif(lower_bound, upper_bound);
std::default_random_engine re;
double a_random_double = unif(re);
cout << a_random_double << endl;
return 0;
}
//compilation: "g++ -std=c++0x program_name.cpp -o program_name"
答案 0 :(得分:5)
您需要在生成样本之前为随机数生成器播种。您在构造default_random_engine
实例时执行此操作。例如:
std::random_device rd;
std::default_random_engine re(rd());
如果您希望对使用的生成器更加规范,那么您应该指定一个而不是依赖于库实现者对default_random_engine
的选择。可用选项列在此处:http://en.cppreference.com/w/cpp/numeric/random#Predefined_random_number_generators
还要注意某些实现不使用random_device
的非确定性源。如果您遇到这样的实现,您需要为种子找到替代来源。
答案 1 :(得分:2)
您必须使用一些初始种子值初始化随机引擎
一个选项是使用 std::random_device
。
#include <iostream>
#include <random>
int main() {
const double lower_bound = 0;
const double upper_bound = 1;
std::uniform_real_distribution<double> unif(lower_bound, upper_bound);
std::random_device rand_dev; // Use random_device to get a random seed.
std::mt19937 rand_engine(rand_dev()); // mt19937 is a good pseudo-random number
// generator.
double x = unif(rand_engine);
std::cout << x << std::endl;
}
您可能希望在线免费观看精彩演示文稿:“rand()
Considered Harmful”(来自GoingNative 2013 C++ event)。
答案 2 :(得分:0)
引擎没有用种子初始化。
#include <chrono>
...
std::default_random_engine re(std::chrono::system_clock::now().time_since_epoch().count());
答案 3 :(得分:0)
正如其他人所说,你没有给发电机一个明确的种子。
让我们来看看发生了什么。 GCC将std::default_random_engine
实现为std::linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL>
。当您编写std::default_random_engine re;
时,您将为此类调用不带参数的构造函数,默认为种子值linear_congruential_engine::default_seed = 1u
。因此,如果您想要1以外的种子,您必须自己提供。
参考:http://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a00860.html