Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398171
  • 博文数量: 69
  • 博客积分: 3005
  • 博客等级: 中校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-07 11:31
文章分类

全部博文(69)

文章存档

2011年(2)

2010年(7)

2009年(32)

2008年(28)

我的朋友

分类: C/C++

2008-10-04 17:09:17

   最近写一个遗传算法的程序,需要用到随机数,很容易想到了C库里面的srand()和rand(),本来以为很简单的东西还是用出了问题。找了些资料,最后才搞定,看似简单的东西并不一定简单。
   简单总结一下吧:
1.RAND_MAX
这个是stdlib.h里面定义的一个宏,定义如下:
/*
 * RAND_MAX is the maximum value that may be returned by rand.
 * The minimum is zero.
 */
#define RAND_MAX 0x7FFF
说的很明白了,这是rand()函数可能返回的最大数,换成十进制就是32767,也就是说调用rand()函数返回结果是[0,32767]间的一个数,注意范围,这是一个闭区间。
 
2.随机数种子
  一般应用都倾向于使用系统时间,所以一般初始化是这样的:
     srand((unsigned)time(NULL));
   这样一来就要包含time.h文件,也有包含windows.h然后调用windows的API来做初始化种子的,有兴趣可以去google之。
   初始化随机数种子只需要在调用rand()前执行一次就好了,一种常见错误就是在每次调用rand()前都调用srand()。
 
3.随机数的范围
   rand()返回一个0~RAND_MAX的随机数,一般这个不是你想得到的数据范围,需要进行调整,比较常用的是'%'和'/'操作,如果需要一个0~100的随机数那么就rand()%100好了,很容易理解。如果你需要一个浮点数,可以考虑用除法,注意运算时的数据转换操作,rand()返回的是整数,RAND_MAX也是整数,如果你想得到一个0到1的浮点数,你这样写rand()/RAND_MAX你就大错特错了,这样的结果是0,原因仔细想想也很简答,基本的C语言运算数据类型提升问题,小数部分的尾巴取整的时候舍掉了,解决方法也很简单rand()/(RAND_MAX-0.0),一个产生指定范围随机数的函数大概是这样的:
double randval(double low, double high)
{
   double val;
   val = ((double)(rand()/(RAND_MAX-0.0))*(high - low)) + low;
   return(val);
}
 
4.随机数有多随机
   教科书上把这里生成的随机数叫做伪随机数,也就是说还是有规律的,至于什么规律,我也不得而知:(
 
 
阅读(7452) | 评论(0) | 转发(0) |
0

上一篇:TM2008Beta不错

下一篇:一个好鼠标太重要了

给主人留下些什么吧!~~