关于rand()与srand()函数

rand函数功能为获取一个伪随机数(伪随机数的概念下面会有介绍)。

一、函数名: 

rand();

 

二、声明:

int rand();

 

三、所在头文件:

stdlib.h

 

四、功能:

返回一个伪随机数。因为rand()内部是用线性同余法做的,在没有其它操作下,每次执行同一个程序,调用rand得到的随机数序列是固定的(不是真正的“随机”)。

 

五、为了使rand的结果更“真”一些,也就是令其返回值更具有随机性(不确定性),C语言在stdlib.h中还提供了srand函数,通过该函数可以设置一个随机数种子,一般用当前时间的毫秒数来做参数。通过time(NULL)可以获取到当前时间的毫秒值(该函数位于time.h)中。

 

六、使用rand的流程可以总结为:

1 调用srand((unsigned)time(NULL))设置随机数种子,当然也可以是其他一些时间函数如 srand((UINT)GetCurrentTime()) 。

2 调用rand函数获取一个或一系列随机数。

需要注意的是,srand只需要在所有rand调用前,被调用一次即可,没必要调用多次。

 

七、以下是随机获取10个整型值并输出的例子,辅助理解。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i;
    
    srand((unsigned)time(NULL));//设置随机数种子。
    
    for(i = 0; i < 10; i ++)//运行10次。
        printf("%d\n", rand());//每次获取一个随机数并输出。
    
    return 0;
}

 最后,说说srand()函数 :
  void srand(unsigned seed) 初始化随机数发生器
C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,觉得至少有三个原因: 
1)可以高效产生连续的随机数,不用每次都初始化; 
2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟; 
3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。

  事实上有一个更重要的原因: 
  作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序列必须是可重现的。 这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一次测试的过程,从而更有效的找到问题的所在。 
  所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。

posted @ 2016-03-27 11:58  章三丰  阅读(5854)  评论(0编辑  收藏  举报