为什么std::uniform_real_distribution
优于rand()
作为随机数生成器?有人可以举个例子吗?
答案 0 :(得分:9)
首先,应该明确提出的比较是荒谬的。
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
正确地为您调整范围。
答案 1 :(得分:9)
真正的比较是rand
和C ++ 11标准库提供的随机数引擎之一。 std::uniform_real_distribution
只根据某些参数(例如,10到20之间的实际值)分配引擎的输出。您也可以制作一个在幕后使用rand
的引擎。
现在,标准库随机数引擎与使用普通旧rand
之间的区别在于保证和灵活性。 rand
无法保证随机数的质量 - 实际上,许多实现在其分布和周期方面都存在缺陷。如果你想要一些高质量的随机数,rand
就是不行。然而,随机数引擎的质量由它们的算法定义。当您使用std::mt19937
时,您确切地知道您从这个经过全面测试和分析的算法中获得了什么。不同的发动机具有您可能喜欢的不同质量(空间效率,时间效率等),并且都是可配置的。
这并不是说当你不太在意时你应该使用rand
。您也可以立即开始使用C ++ 11中的随机数生成工具。没有缺点。
答案 2 :(得分:4)
原因实际上是函数的名称,与std::uniform_real_distribution
提供的随机数的均匀分布相比,rand()
随机数分布的均匀性更好。
std::uniform_real_distribution
的分布当然在给定的间隔[a,b)之间。
基本上,就是说当你要求1到10之间的随机数时,概率密度与获得5或获得9或任何其他可能值{{{ 1}},就像你使用std::uniform_real_distribution
并且多次调用它一样,获得5而不是9的概率可能会有所不同。