随机数函数

来源:互联网 发布:找北极星的软件 编辑:程序博客网 时间:2024/05/17 00:50
 rand

函数:

    rand

 

种类:

    库函数、数学函数

 

用法:

    格式:#include<stdlib.h>

          int rand(void);

    参数:rand()函数不接受参数,默认以1为种子(即起始值)

 

返回值:

    伪随机整数

 

描述:

    rand是一预定在头文件stdlib.h中的库函数,用于生成伪随机整数,所生成的伪随机整数的值介于零与RAND_MAX之间。RAND_MAX最小为37267

范例:

Code:
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. int main()    
  4. {    
  5.      int i,j;    
  6.      for(i=0;i<10;i++)    
  7.      {    
  8.          j=rand();   
  9.          printf("%d ",j);    
  10.      }   
  11.      return 0;   

     

     

    在笔者的机器里面,运行多次的结果,都为:

    41 18467 6334 26500 19169 15724 11478 29358 26962 24464

     

    注意事项:

    随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)

     

     

     

     

    srand

     

    函数:   srand

     

    种类:

    库函数,数学函数

     

    用法:

    格式:#include<stdlib.h>

    void srand(unsingnde int seed);

    参数:seed——所要撒的“种子”值。

     

    返回值:无

     

     

    描述:

    srand是一预定义在头文件stdlib.h中的库函数,用于为顺次调用rand函数所产生的伪随机数序列作初始化(撒下种子)。参数seed必须是个整数,通常可以利用time(0)的返回值来当做seed。(time函数稍后再讲。)

    注:如果在调用rand函数之前未先调用srand函数,那么就相当于先调用函数srand(1)

     

     

    范例:

    Code:
    1. #include <stdio.h>   
    2. #include<stdlib.h>    
    3. int main()    
    4. {    
    5.     int i,j;    
    6.     srand(1);    
    7.     for(i=0;i<10;i++)    
    8.     {    
    9.         j=rand();    
    10.         printf("%d ",j);    
    11.     }    
    12.     return 0;   
    13. }  

     

    在笔者的机器里面,运行的结果,和上面的范例是一样的,都为:

    41 18467 6334 26500 19169 15724 11478 29358 26962 24464

    (这是因为撒下的种子为“1”,和rand的默认种子一样)

     

    注意事项:

    如果用同样的变元(种子)值调用了srand函数,那么在其后多次对rand函数调用所产生的伪随机整数的序列是相同的。

     

     

     

     

    产生不同的伪随机数。

     

     

    如果种子相同,伪随机数列也相同。那么这样又要怎么产生伪随机数呢?一个办法是让用户输入种子,但是仍然不理想。另一个是用变化的数,比如时间来作为随机数生成器的种子。time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。

     

     

    范例:

    Code:
    1. #include <stdio.h>   
    2. #include <stdlib.h>   
    3. #include <time.h>   
    4. int main(void)    
    5. {    
    6.     int i=0;   
    7.     srand(time(0));   
    8.     for(i=0; i<10; i++)    
    9.     {   
    10.         printf("%d ",rand());   
    11.     }   
    12.     return 0;    
    13. }   

    在笔者的机器里面,2次产生的结果为:

    6442 3736 26247 23042 25067 26259 31013 16062 6454 24181

     

    6625 15823 10833 27100 12859 16780 8702 15975 13599 7569

    大家看到了,这个时候,产生的伪随机数就不相同了。

     

     

     

     

    注意事项:

    使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1)

     

     

    rand函数使用的一些技巧:

     

    由于rand产生的随机数从0RAND_MAX,那么如何产生一个在自己控制范围之类的数呢?

     

    对上面的代码进行下修改:

    Code:
    1. #include <stdio.h>   
    2. #include <stdlib.h>   
    3. #include <time.h>   
    4. int main(void)    
    5. {    
    6.     int i=0;   
    7.     int MAX=100;   
    8.     srand(time(0));   
    9.     for(i=0; i<10; i++)    
    10.     {   
    11.         printf("%d ",rand()%MAX);   
    12.     }   
    13.     return 0;    
    14. }  

    查看产生的值,81847355635128398

    这个时候,产生的值都在100以内了。

     

    总结一下:

    a + rand() % n
        
    其中的a是起始值,n是整数的范围。

     

    a + rand() % (b-a+1)

    就表示 a~b之间的一个随机数

     

     

     

    最后,说明下rand函数的原理

     

        先前,一直强调rand产生的是一个伪随机数,为什么这么说呢?

    rand是一个函数,函数顾名思义就是有输入、有输出,可是对于一个用ifforwhile这些语句写出来算法来讲,如果输入是确定的,那么输出也就是确定的,这样的rand函数就无法生成随机数了,因为每次输出都是确定的。那么怎么能够实现输出不确定呢?计算机里变量等等值值都是一个固定的值,而只有系统时钟是不断变化的,因此srand的函数就是用来取当前系统时钟的值。然后保证每次调用rand产生的随机数序列是“不确定”的。因为这个“不确定”也是假的“不确定”,因为其实当前系统时钟的值也是一个可以算出来的值,所以我只要熟悉rand函数的内部实现,我就能猜出来每次调用rand函数产生的随机数是多少,这正是“伪随机”的意思。

    在计算机中完全依靠软件算法是无法产生真正的随机数的,因为还是那句话,对于一个算法来讲“输入是确定的,那么输出也就是确定的”,要产生真正的随机数就要靠采集外部不确定的变量,比如使用一个探测器探测地磁场场强的变化、采集晶体管内热噪声的变化等等,这样才能产生真正的随机数。

  12. }   
原创粉丝点击