基础知识:在c++中要产生随机数的时候可以使用使用随机数产生函数 int rand(void);
本函数产生一个从0到0x7fff(32767)之间的值;
每次调用rand()产生的数列是相同的;是伪随机数;例如
include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int a;
for(int i=0;i<20;i++)
{
a=rand();
cout<<a<<endl;
}
return 0;
}
这段程序无论何时调用产生的20个数组成的数列是一样的;
为了解决这个问题,在每次调用rand()之前先调用一次srand(int x)函数,这样rand()产生的随机数在x和32767之间;
但是,如果下次调用rand()函数之前不改变x的值产生的依然是一系列的伪随机数,尤其在循环的时候;这样有必要在每次调用srand(int x)的时候设置不同的x值;
聪明的程序员想到了利用计算机里的time函数来获得一个几乎随时变动的值;
这个x值就是种子数,随时让计算机产生;
函数:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。
每次调用rand()函数前分两种情况
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么调用rand()时它会自动使用上次的值
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。把种子数设定为1;
所以根据上面的情况我们就可以得出:
1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个新值,这个值必须在每次程序运行时都不一样(比如从1970年到目前为止流逝的时间)。
下面说说time;
关于time_t time(0):要调用这个函数必须包括头文件<time.h>。time_t 被定义成了long;
它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
这样在每次生成随机数之前先调用srand((unsigned)time(0));就设置了seed的值;
你马上就会说这个数比32767大,是的,它在机器内部溢出了,只利用最后的有效数字;
以下就是源码;
#include <ctime>
int rand_num;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
rand_num=rand() ;
cout<<rand_num<<" ";
}
这样产生的随机数你可以随便利用了。例如你要产生从a到b之间的随机数可以用
(rand_num% (b-a))+ a 来求;此处含a,不含b;要含b,在取余时(b-a+1)即可;
要产生0到9之间的随机数含0,含9;用rand_num%10;就行;
产生11到15之间的随机数,含11,含15,用rand_num%5+11就行,以此类推;