C语言函数库中包含了一个产生随机数的函数:int rand( void ); 函数返回的是一个界于0~32767之间的伪随机数,包括0和32767。但是,这里产生的是伪随机数,不是真正意义上的随机数,看下面的程序:
#include "stdlib.h"
#include "stdio.h"
void main( )
{
printf( " %d\n",rand() );
}
运行结果:41
多次运行程序,发现每次运行结果均相同(不同的计算机运行结果可能不同),这说明这种方法产生的随机数并不是一个真正随机的数,而是一个伪随机数。这是因为C语言中,随机数表有很多列,srand函数是根据其参数(unsigned类型)来获得一个种子(seed),根据种子来设置从哪一列开始取随机数。rand无参数,返回一个相应的随机数。种子相同,则从同一列随机数中选取,rand每次选取之后会自动选取下一个随机数。如果srand设置的种子相同,则会从同一列随机数中选取。
那么,如何产生一个真正意义的随机数呢?
问题的关键在于种子的选取。我们的目的是要在不同的时间生成不同的随机数。因此,只要有一个只和时间有关的数,将其传递给srand,就可以达到目的了。这样的函数位于time.h头文件中。函数名即为time。调用time会返回一个和时间有关的整数。
例如,运行下面的程序:
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
void main()
{
int i; /*将当前时间设置成随机函数的种子,所以每次产生的数都不一样*/
srand( (unsigned)time( NULL ) ); /* 输出10个随机数*/
for( i = 0; i < 10;i++ )
printf( "%d\n", rand() );
}
结果为
20333
21010
16307
24721
8549
4749
2651
20114
5814
30943
再次运行程序,结果为:
20555
31006
18655
22627
21812
9622
17690
17668
14490
6090
每次运行程序得到的随机数均不同,达到了随机数的要求。
容易得知,A=rand()%x+y则表示产生一个x~x+y之间的随机数。
如果要输出1~10的随机数,可写为printf( "%d\n", rand() %10+1);
例如,
int a;
a=rand()%89+10;
执行该语句后,a即可得到一个10~100之间的整数赋值。
到x+y之间的随机数。