在计算机编程中,常常要产生一个随机数。而rand()与srand()函数配合就可以实现这个目的。

     在计算机编程中,常常要产生一个随机数。但是要让计算机产生一个随机数并不那么容易。计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数。只可能以一定的算法产生一个伪随机数,C/C++提供了一个函数,放在cstdlib中,叫做rand(),原型为:int rand(void);。

     显然,这个函数不接受任何参数,它的作用是:产生一个[0..RAND_MAX]之间的随机数。RAND_MAX也存放在cstdlib中,是一个宏常量:

#define RAND_MAX Ox7FFF

 

     RAND_MAX最大是

,默认是

。但是总不可能每改一次范围,都将常量修改。所以一般都这样使用:

rand()%max    //这个表达式会生成[0..max-1]之间的随机数

     这个函数并不可以凭空产生随机数,而是需要一个随机数种子。这个种子由同样存放在cstdlib中的srand函数提供,原型为:void srand(unsigned seed);。当你使用rand()但是没有提前产生一个种子时,默认情况下初始化种子值为1。如果用户之前调用过srand(seed)的话,rand()会重新调用一遍srand(seed)以产生随机数种子;如果发现没有调用过 srand(seed)的话,则会自动调用 srand(1)一次。而相同的种子只会生成相同的随机数序列。所以,只有srand(seed)后,才能得到你所要的结果——近似随机的伪随机数。看一下下面的程序。

#include <cstdlib>
  #include <ctime>
  #include <iostream>

  using namespace std;
  const int maxs=10;

  int main() {
      for (int i=0;i<=10;++i){
          srand(time(NULL));
          cout<<rand()%maxs<<endl;
      }
      return 0;
  }

 

     运行之后,你会发现,纵使指定了随机数种子,但是仍没有得到想要的结果——它输出了10个一模一样的随机数!想一想,time(NULL)返回一个1970-1-1 00:00:00到当前时间的秒数。但是由于for运行太快了,所以rand()产生了相同随机数序列中的第一个数,要想避免这个问题,其实也很简单,只要将srand(seed)提到for循环之前,这样就只会产生一次种子。问题也随之解决了。