使用 C++11 随机库生成随机数
正如标题所示,我正试图找出一种使用新的 C++11 <随机>
库生成随机数的方法。我用这段代码进行了尝试:
std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);
代码的问题是,每次编译和运行时,生成的数字总是一样的。因此,我的问题是,随机库中还有哪些函数可以在实现真正随机的同时达到这一目的?
对于我的特定用例,我试图得到一个范围在 `[1, 10]`` 内的值。
127
3
来自微软的 Stephan T. Lavavej (stl) 在 Going Native 大会上发表了关于如何使用新的 C++11 随机函数以及为什么不使用
rand()
的演讲。其中,他的一张幻灯片基本上解决了你的问题。我将该幻灯片中的代码复制如下。您可以在此处查看他的完整演讲:http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
以下是我刚写的一些内容::
~
有两种常见情况。第一种情况是您需要随机数,但对随机数的质量或执行速度并不太在意。在这种情况下,请使用以下宏
可以得到范围在 0 到 1 - epsilon 之间的 p(除非 RAND_MAX 大于 double 的精度,不过这个问题到时再考虑)。
int x = (int) (uniform() * N);
现在给出一个 0 到 N -1 的随机整数。
如果需要其他分布,则必须变换 p,或者有时多次调用 uniform() 更简单。
如果你想要可重复的行为,可以使用常数作为种子,否则可以调用 time() 作为种子。
如果你担心质量或运行时的性能,可以重写 uniform()。否则就不要碰代码。始终将 uniform() 设为 0 至 1 减ε。现在,你可以使用 C++ 随机数库来创建更好的 uniform(),但这只是中级选项。如果你对 RNG 的特性感到困扰,那么也值得投入一点时间来了解底层方法是如何工作的,然后提供一个。这样,您就可以完全控制代码,并保证使用相同的种子,序列将始终完全相同,而不受平台或所链接的 C++ 版本的影响。