[英]std::uniform_real_distribution and rand()
为什么std::uniform_real_distribution
比rand()
更好作为随机数生成器? 有人可以举个例子吗?
首先,应该明确提出的比较是荒谬的。
uniform_real_distribution
不是随机数生成器。 如果没有传递给operator()
的随机数生成器,则无法从uniform_real_distribution
生成随机数。 uniform_real_distribution
将该随机数生成器的输出“形状”化为统一的实数分布。 您可以将各种随机数生成器插入分发中。
我认为这不是一个体面的比较,所以我将比较使用uniform_real_distribution
与C ++ 11随机数生成器对rand()
。
使比较更有用的另一个明显差异是uniform_real_distribution
用于产生浮点数,而rand()
产生整数。
也就是说,有几个理由喜欢新设施。
rand()
是全局状态,而当使用<random>
,不涉及全局状态:您可以拥有任意数量的生成器和发行版,它们彼此独立。
rand()
没有关于生成序列质量的规范。 来自C ++ 11的随机数生成器都是明确指定的,分布也是如此。 rand()
实现可以是,并且在实践中已经是非常差的质量,并且不是非常均匀的。
rand()
提供预定义范围内的随机数。 程序员可以将该范围调整到所需范围。 这不是一项简单的任务 。 不,使用%东西是不够的。 以这种天真的方式进行这种调整很可能会破坏原始序列中的任何均匀性。 uniform_real_distribution
正确地为您调整范围。
真正的比较是rand
和C ++ 11标准库提供的随机数引擎之一。 std::uniform_real_distribution
只是根据一些参数(例如,10到20之间的实际值)分配引擎的输出。 你也可以制作一个在幕后使用rand
的引擎。
现在,标准库随机数引擎与使用普通旧rand
之间的区别在于保证和灵活性。 rand
不保证随机数的质量 - 实际上,许多实现在它们的分布和周期方面都有缺点。 如果你想要一些高质量的随机数, rand
就是不行。 然而,随机数引擎的质量由它们的算法定义。 当您使用std::mt19937
,您确切地知道您从这个经过全面测试和分析的算法中获得了什么。 不同的发动机具有您可能喜欢的不同质量(空间效率,时间效率等),并且都是可配置的。
这并不是说你不太在乎你应该使用rand
。 您也可以立即开始使用C ++ 11中的随机数生成工具。 没有缺点。
原因实际上是函数的名称,即rand()
提供的随机数的均匀分布与std::uniform_real_distribution
相比,随机数分布的均匀性更好。
std::uniform_real_distribution
的分布当然在给定的区间[a,b)之间。
从本质上讲,这就是说当你要求1到10之间的随机数时,概率密度与使用std::uniform_real_distribution
得到5或获得9或任何其他可能值一样大,就像你做的那样使用rand()
并多次调用它,获得5而不是9的概率可能会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.