一个随机数生成函数

 最近写一个遗传算法的程序,须要用到随机数,很容易想到了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.随机数有多随机
   教科书上把这里生成的随机数叫作伪随机数,也就是说仍是有规律的,至于什么规律,我也不得而知:(
相关文章
相关标签/搜索