Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2697198
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: LINUX

2015-02-02 11:09:50


http://blog.csdn.net/include1224/article/details/6568895

我们知道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<
  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内调用多次,那么产生的数据是相同的。可以用下面的代码进行测试。


  1. for (int i = 0;i<1000;++i)  
  2.     std::cout<


 


  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----

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

返回处理器调用某个进程或函数所花费的时间,单位是1秒的CLOCKS_PER_SEC分之一,其中CLOCKS_PER_SEC在vs2008版本的time.h中的定义是1000,这样就使得种子变化的速度变快,降低随机数重复概率。

阅读(952) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~