C/C++随机数rand()和种子函数srand()

2023-02-12,,,,

在计算机编程中,常常要产生一个随机数。但是要让计算机产生一个随机数并不那么容易。计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数。只可能以一定的算法产生一个伪随机数,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=; int main() {
for (int i=;i<=;++i){
srand(time(NULL));
cout<<rand()%maxs<<endl;
}
return ;
}

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

C/C++随机数rand()和种子函数srand()的相关教程结束。

《C/C++随机数rand()和种子函数srand().doc》

下载本文的Word格式文档,以方便收藏与打印。