为什么std::uniform_real_distribution
比rand()
作为随机数生成器更好?有人可以举个例子吗?
3 回答
首先,应该明确提出的比较是荒谬的。
uniform_real_distribution
不是随机数生成器。uniform_real_distribution
如果没有传递给它的随机数生成器,就无法从 a 生成随机数operator()
。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 中的随机数生成工具。没有缺点。
原因实际上在于函数的名称,即随机数分布的均匀性std::uniform_real_distribution
比提供的随机数均匀分布要好rand()
。
的分布std::uniform_real_distribution
当然是在给定的区间 [a,b) 之间。
本质上,这就是说,当你要求一个介于 1 和 10 之间的随机数时,得到 5 或得到 9 或任何其他可能值的概率密度std::uniform_real_distribution
与你使用rand()
并调用它时一样大几次,得到 5 而不是 9 的概率可能不同。