C++中生成随机数的几点注意事项

来源:互联网 发布:和我信造粉软件 编辑:程序博客网 时间:2024/04/28 15:12

我们知道rand()函数可以生成随机数,其实是在种子的基础上做某种变换并返回生成的随机数。在默认情况下,种子是1。写一个小程序测试一下。

  1. main()  
  2. {  
  3. int i,j;  
  4. for(i=0;i<10;i++)  
  5. {  
  6. j=1+(int)(10.0*rand()/(RAND_MAX+1.0));  
  7. cout<<j<<endl;  
  8. }  
  9. }    
  10.    执行: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内调用多次,那么产生的数据是相同的。可以用下面的代码进行测试。

[cpp] view plaincopy
  1. for (int i = 0;i<1000;++i)  
  2.     std::cout<<randSelectQuestion(1,1000)<<'/t';  

 

[cpp] view plaincopy
  1. int randSelectQuestion(int from,int to)  
  2. {//在from和to号之间选择一个数字  
  3.     srand((unsigned)time(NULL));  
  4.     int span = 0;  
  5.     if (to>from)  
  6.     {  
  7.         span = to - from;  
  8.         return from+rand()%span;  
  9.     }  
  10.     else  
  11.     {  
  12.         span = from - to;  
  13.         return to+rand()%span;  
  14.     }     
  15. }  

运行上面的程序,会发现随机数重复相当厉害。根据随机数生成的原理,我们可以让种子变化快一些来降低重复概率:将time()换成clock(),

注意:clock()没有输入参数。

clock----Calculates the wall-clock time used by the calling process.

返回处理器调用某个进程或函数所花费的时间,单位是1秒的CLOCKS_PER_SEC分之一,其中CLOCKS_PER_SEC在vs2008版本的time.h中的定义是1000,这样的意思是每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。

0 0
原创粉丝点击