随机数种子与随机数

来源:互联网 发布:汉诺塔递归算法伪代码 编辑:程序博客网 时间:2024/04/27 21:49

 本文要讨论的内容就是,在C语言中,是如何取得这个随机数的?  
   
  一个语句:rand();  
  它的作用就是随机取0到RAND_MAX之间的任何数。ANSI标准指出,RAND_MAX值的范围到少是32767,也就是双字节整数的最大值。  
   
  下面我们用一个例子来取得从1到6的随机整数:  
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  main()  
  {  
  int   i;  
   
  for(i=1;i<=20;i++)  
  printf("%10d",1+(rand()%6));  
   
  }  
   
  第2行的stdlib.h是rand()函数的头文件,第7行就是   实现功能的语句了。前面我们以经说过函数取的值是介于0到RANDMAX之前的,而我们所要的是1到6之间的整数。用脚想一想就知道:任一整数除以6所得的余数是0~5之间的整数,再加一之后就是1到6了,也就是我们的目标。利用这个原理我们使用%号对随机数进行了缩放。  
   
  OK,运行两次程序:  
  一:6   6   5   5   6   5   1   1   5   3   6   6   2   4   2   6   2   3   4   1    
  二:6   6   5   5   6   5   1   1   5   3   6   6   2   4   2   6   2   3   4   1  
   
  发现:两次运行的结果完全一样。  
  结论:这算什么随机数。  
   
  具有讽刺意味的是,这种重复性是rand的一个重要特点,在调试程序时,这种重复性是必不可少的,因为它可以证明对程序的修改能够正常运行。  
   
  实际上,rand函数产生的是伪随机数。但我们需要的是随机数。于是,我们需要对程序进行随机化,这需要使用标准库函数srand来实现。函数srand需要一个无符号的整型参数,在每次程序执行时用函数rand去生在一组不同的随机数。如下例:  
   
  #include   <stdlib.h>  
  #include   <stdio.h>  
   
  main()  
  {  
  int   i;  
  unsignde   seed;  
   
  printf("Enter   a   seed:");  
  scanf("%u",&seed);  
  srand(seed);  
   
  for(   i   =   1;i<=20;i++)  
  printf(""%10d",1+(rand()%6));  
  }  
   
  程序的运行结果是当我们输入不同的SEED时,产生不同组的随机数。这句话的意思有两个:一:当输入相同的SEED时,产生的同组随机数;二:每次运行我们都要输入一个SEED。  
   
  如果我们希望不用每次输入SEED值,而且每次运行时SEED值都是不同的,我们可以用下面语句代替上面的第三块的三个语句:  
   
  srand(time(NULL));  
   
  这会使计算机自动读取自己的时钟以获得SEED值。于是我们就获值了每次运行都会改变的SEED,同样也就获得了真正的随机数。