我们知道rand()函数可以生成随机数,其实是在种子的基础上做某种变换并返回生成的随机数。在默认情况下,种子是1。写一个小程序测试一下。
main() { int i,j; for(i=0;i<10;i++) { j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); cout<<j<<endl; } } 执行:9 4 8 8 10 2 4 8 3 6
每次执行结果都是 9 4 8 8 10 2 4 8 3 6。在没有修改种子的情况下,程序每次运行都会产生相同的一组随机数。
可以调用srand(unsigned seed)修改种子,这样先后两次运行的程序就会产生的随机数就会不同。一般会选用时间作为种子,例如:
srand((unsigned)time(NULL));
这样种子会随时间在变,产生的随机数重复的可能性就小。但是这里还存在一个问题:time返回的是距离1970.01.01零时的秒数 ,如果rand函数在1s内调用多次,那么产生的数据是相同的。可以用下面的代码进行测试。
for (int i = 0;i<1000;++i) std::cout<<randSelectQuestion(1,1000)<<'/t';
int randSelectQuestion(int from,int to) {//在from和to号之间选择一个数字 srand((unsigned)time(NULL)); int span = 0; if (to>from) { span = to - from; return from+rand()%span; } else { span = from - to; return to+rand()%span; } }
运行上面的程序,会发现随机数重复相当厉害。根据随机数生成的原理,我们可以让种子变化快一些来降低重复概率:将time()换成clock(),clock----
Calculates the wall-clock time used by the calling process.
返回处理器调用某个进程或函数所花费的时间,单位是1秒的CLOCKS_PER_SEC分之一,其中CLOCKS_PER_SEC在vs2008版本的time.h中的定义是1000,这样就使得种子变化的速度变快,降低随机数重复概率。