我听到一些人说,即使在使用srand()
获得种子之后,使用rand()
也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?
这个故事有两个部分。
首先,rand
是伪随机数生成器。这意味着它取决于一个种子。对于给定的种子,它总是给出相同的序列(假设实现相同)。这使得它不适合于安全问题很大的某些应用程序。但这并不特定于rand
。这是任何伪随机发生器的问题。在许多问题的类中,伪随机发生器是可以接受的。真随机生成器有其自身的问题(效率、实现、熵),所以对于与安全性无关的问题,最常用的是伪随机生成器。
所以你分析了你的问题,你得出一个伪随机发生器是解决方案。在这里,我们谈到了C random库(包括RAND
和SRAND
)的真正问题,这些问题是由哪些特定于它而使它过时的(也就是:您永远不应该使用RAND
和C random库的原因)。
>
一个问题是它具有全局状态(由srand
设置)。这使得无法同时使用多个随机引擎。它还使多线程任务大大复杂化。
它最明显的问题是缺少一个分发引擎:rand
给出了一个间隔[0 RAND_MAX]
中的数字。在这个区间内是均匀的,这意味着这个区间内的每个数字出现的概率是相同的。但大多数情况下,您需要一个特定间隔中的随机数。假设[0,1017]
。一个常用的公式是rand()%1018
。但这样做的问题是,除非rand_max
是1018
的精确倍数,否则不会得到统一的分布。
另一个问题是rand
的实现质量。这里有其他的答案比我更详细,所以请阅读它们。
在现代C++中,您肯定应该使用
中的C++库,该库带有多个随机的、定义良好的引擎,以及用于整数和浮点类型的各种发行版。