【发布时间】:2012-11-09 14:34:35
【问题描述】:
为什么std::uniform_real_distribution 比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 正确地为您进行了此范围调整。
【讨论】:
uniform_real_distribution 不是随机数生成器?那么对你来说,RNG 是什么?
uniform_real_distribution,顾名思义,就是一个随机数分布。看看它的operator() 的论据是什么:生成器!
真正的比较是rand 和 C++11 标准库提供的随机数引擎之一。 std::uniform_real_distribution 只是根据一些参数(例如,10 到 20 之间的实际值)分配引擎的输出。您也可以制作一个在幕后使用rand 的引擎。
现在标准库随机数引擎和使用普通的旧 rand 之间的区别在于保证和灵活性。 rand 不保证随机数的质量——事实上,许多实现在它们的分布和周期上都有缺陷。如果你想要一些高质量的随机数,rand 是不行的。然而,随机数引擎的质量是由它们的算法定义的。当您使用std::mt19937 时,您确切地知道您从这个经过全面测试和分析的算法中得到了什么。不同的引擎具有您可能喜欢的不同品质(空间效率、时间效率等),并且都是可配置的。
这并不是说当您不太在意时应该使用rand。您不妨立即开始使用 C++11 中的随机数生成工具。没有缺点。
【讨论】:
原因其实就在函数名上,就是std::uniform_real_distribution提供的随机数分布均匀性比rand()提供的随机数均匀分布要好。
std::uniform_real_distribution 的分布当然是在给定区间 [a,b) 之间。
本质上,就是说当您要求 1 到 10 之间的随机数时,概率密度与得到 5 或得到 9 或@987654324 的任何其他可能值一样大@,就像你用rand() 做它并多次调用它时,得到 5 而不是 9 的概率可能会有所不同。
【讨论】: