随机数

来源:互联网 发布:网络招生哪家强 编辑:程序博客网 时间:2024/04/30 13:10
这篇文章主要总结一些关于C语言随机数的知识和技巧,比如srand()函数的用法,RAND_MAX的用法等等。

rand()函数
首先,我们了解一下rand()函数。
使用rand()函数时,需要include头文件<stdlib.h>。rand()函数的接口为'int rand(void);'也就是说调用rand()函数不需要使用参数,其返回值为整形(integer)。
“The rand() function returns a pseudo-random integer in the range 0 to RAND_MAX inclusive.” 然而,我们需要注意的是,rand()产生的随机数并不是真正的随机数,是伪随机数(pseudo-random integer)。
我们可以用一个简单的小程序测试一下:
#include <stdio.h>#include <stdlib.h>#define N 100int main(int argc, char *argv[]){    printf("%d\n", rand()%N);    return 0;}
这个小程序会打印一个随机整数。然而,我们多次运行这个程序就会发现一个问题,每次打印的随机数是相同的。原因很简单,rand()产生的是伪随机数。如何解决这个问题呢?我们需要使用srand()函数。

srand()函数
在程序中使用srand()函数时,我们需要include <stdlib.h>文件。srand()的函数接口是'void srand(unsigned int seed);',其返回值为void,需要一个无符号整数。
那么,这个函数是用来做什么的呢? “The srand() function sets its argument as the seed for a new sequence of pseudo-random integers to be returned by rand(). These sequences are repeatable by calling srand() with the same seed value.” 这段话告诉我们,srand()的参数seed值决定了rand()函数返回的伪随机数序列。
我们可以修改上面的程序,来测试一下srand()函数的功能。
#include <stdio.h>#include <stdlib.h>#define N 100void rand_num(unsigned int s){    int i;    srand(s);    printf("seed %u: ", s);    for (i = 0; i < 10; i++)        printf("%d ", rand()%N);    putchar('\n');}int main(int argc, char *argv[]){    rand_num(1);    rand_num(2);    rand_num(1);    return 0;}
这个程序的执行结果是这样的:我们可以很明确的发现,相同的seed产生的随机数序列是相同的。


srand()函数的seed最好是一个不确定的整数,这样rand()才能产生不同的随机数序列。我们通常使用time()函数得到当前系统距1970年1月1日00:00:00(Epoch)的秒数,然后传给srand。例如: srand(time(NULL));

RAND_MAX
RAND_MAX是stdlib.h头文件里的宏定义,是rand()函数所能产生的最大的随机数。我们可以使用RAND_MAX做一些更有用的事情。
1.生成随机浮点数,我们把上面程序中第13行改为:
printf(“%.2f “, (float)rand()/RAND_MAX);
这样,就可以生成浮点随机数了,注意(float)的显式类型转换。。
2.我们还可以利用RAND_MAX生成0/1随机数。我们把上面程序的第13行改为:
printf(“%d “, rand() > RAND_MAX/2);
这样就可以了。

好了,通过对rand()函数,srand()函数和RAND_MAX宏的介绍,相信我们对C语言随机数的知识有了一个基础而初步的了解。