一个随机数生成函数

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

转载于:https://www.cnblogs.com/skl374199080/p/4914275.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值