prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 13.17

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 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管