Random double C++11
Random double C++11
下面的代码显示了如何在 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"
在生成样本之前,您需要为随机数生成器设定种子。您可以在构造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
。如果您面临这样的实现,则需要为您的种子找到替代来源。
你必须用一些初始种子值初始化随机引擎.
一种选择是使用 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()
被认为是有害的"(来自GoingNative 2013 C++活动)。
引擎未使用种子初始化。
#include <chrono>
...
std::default_random_engine re(std::chrono::system_clock::now().time_since_epoch().count());
正如其他人所指出的,您没有为生成器提供明确的种子。
让我们看看发生了什么。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
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++在数学计算中将double转换为int
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- 在c++中为double类型的数组创建一个unique_ptr
- C++11 中不同类型的对象的 std::array 的替代方案
- 使用 GCC 和 C++11 实施类型 "long double"
- 有没有办法<int><double>在使用 C++11 函数调用期间自动将"向量"提升为"向量"?
- Random double C++11
- 什么是 bool()、int() 和 double() 在 C++/C++11 中
- C++11 是否强制 pow(double, int) 使用较慢的 pow(double, double)
- 为什么从c++ 11中删除了std::pow(double, int) ?