Q每次运行我的程序时,我从rand().
A这是大多数伪随机数生成器的一个特性(以及 C 库的一个定义属性rand),即它们总是以相同的数字开始,并经历相同的序列。(除其他事项外,一点可预测性可以使调试更容易。)当你不想要这种可预测性时,你可以调用srand用一个真正随机的(或至少是可变的)初始值来播种伪随机数生成器。常用的种子值是一天的当前时间,或进程 ID 号,或用户按下键之前经过的时间,或这些的某种组合。下面是一个示例调用,使用一天的时间作为种子
#include <stdlib.h> #include <time.h> srand((unsigned int)time((time_t *)NULL));(仍然存在几个困难:由time返回的time_t可能是一个浮点类型,因此不能可移植地转换为unsigned int而不至于溢出。此外,如果一天的时间可用的分辨率为 1 秒,那么仅使用它意味着程序的连续运行很容易获得相同的种子。时间的亚秒级分辨率,无论是当天时间还是按键次数,都很难可移植地实现;请参阅问题 19.37。)
另请注意,在程序运行期间调用srand一次以上很少有用;特别地,不要尝试调用srand在每次调用rand之前,以尝试获得“真正随机”的数字。
参考文献:K&R2 第 7.8.7 节,第 168 页
ISO 第 7.10.2.2 节
H&S 第 17.7 节,第 393 页