标签:
最近写一个遗传算法的程序,需要用到随机数,很容易想到了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.随机数有多随机
教科书上把这里生成的随机数叫做伪随机数,也就是说还是有规律的,至于什么规律,我也不得而知:(
一个随机数生成函数
标签:
原文地址:http://www.cnblogs.com/skl374199080/p/4914275.html