C语言中生成伪随机整数:rand()和srand()

在C语言中,我们可以利用由头文件<stdlib.h>声明的rand()函数来生成伪随机整数。

int chosen = 0 ;
chosen = rand ( ) ;    //设置为一个随机整数

每次调用rand()函数,它都会返回一个随机整数,这个值在 0 到<stdlib.h>定义的 RAND_MAX 之间。由rand()函数产生的整数称为伪随机数(pseudo-random),因为真正的随机数只能在自然的过程中产生,而不能通过运算法则产生。

rand()函数使用一个起始的种子值生成一系列数字,对于一个特定的种子,所产生的序列数永远是相同的,如果使用这个函数和默认的种子值,如上面代码所示,就总是得到相同的序列数,这在测试程序时比较有用。stdlib.h提供了另一个标准函数srand(),在调用这个函数时,可以用作为参数传递给函数的特定种子值初始化序列数。

那么,怎么才能让程序每次执行时,生成一个不用的种子值呢?

此时可以使用另一个库函数:在<time.h>头文件中声明的函数 time()time()函数会把自1970年1月1日起至今的总秒数返回为一个整数,因为时间永不停歇,所以每次执行程序时,都会得到不同的值。time()函数需要一个参数NULL,NULL 是在<stdlib.h>中定义的符号,表示不引用任何内容。

/*要在每次执行程序时得到不同的随机序数列,可以使用一下语句*/
srand(time(NULL)) ;    //使用时钟值作为开始的种子
int chosen = 0 ;
chosen = rand() ;    //设置为一个范围为 0 到 RAND_MAX 的随机整数

只需要在程序中调用一次函数srand()来生成序列。之后每次调用rand(),都会得到另外一个伪随机数。上限值 RAND_MAX 相当大,通常是类型 int 可以存储的最大值。如果需要更小范围的数值,可以按比例缩小 rand() 的返回值,提供所需范围的值。

/*假设要得到的数值在 0 到 limit(不包含 limit)的范围内,最简单的方法如下*/
srand(time(NULL)) ;    //使用时钟值作为开始的种子
int limit = 20 ;          //伪随机值的上限
int chosen = 0 ;
chosen = rand() % limit ;    //0 到 limit-1包括在内

/*如果数值需要在 1 到 limit 之间*/
chosen = 1 + rand() % limit ;   //1 到 limit-1包括在内

一般来说,最好不要限制伪随机数产生器产生的数值的范围。因为实质上是将返回值的高位字节去掉,并假设剩余的字节也代表随机数。这就不一定了。

2018-05-06 23:24:20  星期天

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注