C语言中的随机数问题

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之间的随机数。

你可能感兴趣的:(C语言中的随机数问题)