正如标题所示,我正在尝试找出一种使用新的 C++11 生成随机数的方法<random>
图书馆。我用这段代码尝试过:
std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);
我的代码的问题是每次编译和运行它时,它总是生成相同的数字。所以我的问题是随机库中还有哪些其他函数可以在真正随机的情况下完成此任务?
对于我的特定用例,我试图获取范围内的值[1, 10]
来自 Microsoft 的 Stephan T. Lavavej(stl) 在 Going Native 上做了一次关于如何使用新的 C++11 随机函数以及为什么不使用的演讲rand()
。他在其中添加了一张幻灯片,基本上可以解决您的问题。我已经复制了下面幻灯片中的代码。
你可以看到他的完整演讲here https://learn.microsoft.com/en-us/events/goingnative-2013/rand-considered-harmful:
#include <random>
#include <iostream>
int main() {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1.0, 10.0);
for (int i=0; i<16; ++i)
std::cout << dist(mt) << "\n";
}
We use random_device
一次为名为的随机数生成器播种mt
. random_device()
慢于mt19937
,但它不需要播种,因为它从您的操作系统请求随机数据(这些数据将来自不同的位置,例如RdRand http://en.wikipedia.org/wiki/RdRand例如)。
看着这个问题/答案 https://stackoverflow.com/questions/16224446/stduniform-real-distribution-inclusive-range, 看起来uniform_real_distribution
返回范围内的数字[a, b)
, 你想在哪里[a, b]
。为此,我们的uniform_real_distibution
实际上应该看起来像:
std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)