• 一个随机数生成函数


     最近写一个遗传算法的程序,需要用到随机数,很容易想到了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.随机数有多随机
       教科书上把这里生成的随机数叫做伪随机数,也就是说还是有规律的,至于什么规律,我也不得而知:(
     
  • 相关阅读:
    面试官让我手写一个生产者消费者模式
    怎么用wait、notify巧妙的设计一个Future模式?
    并发编程之Master-Worker模式
    你和那些优秀的人差距在哪里?
    idea 2019.3 最新版破解教程
    JVM垃圾回收详解
    Java类加载器和双亲委派机制
    Java代理模式/静态代理/动态代理
    JSP自定义标签/自定义标签打包
    MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射
  • 原文地址:https://www.cnblogs.com/skl374199080/p/4914275.html
Copyright © 2020-2023  润新知