随机数函数rand大家一定都使用得炉火纯青了,但是如何你想自己实现一个rand函数该怎么办呢?这篇文章让我来简单介绍一下随机数的常用生成方法
最近工作太忙,几乎没精力写文章,竟然有人催更,好在这段时间也没人取关,哈哈,那就小更一篇吧。
真假随机数
其实计算机中的随机数都是伪随机数,因为它并不是真正随机的。只有完全无法预测下一次的数字才能算是真正的随机数。相抵比较"真随机"的方法有:通过当前温度+PM2.5+风力...、CPU温度+内存条温度+...。重点在于无法预测,但是这些随机数获取的成本也相对比较大。
线性同余法
大部分语言的随机数都是通过"线性同余法"生成的,这是什么鬼方程(哪位好学生给科普一下)?我们不管原理,只管实现~线性同余法的方程为:N2 = (A X N1 + B) % M,仅当B能够被A与M的最大公约数整除,此方程有解。我们只要保证A和M互质就可以了。
下面是我用PHP的简单实现,如有错误,随便指出:
/**
    * 伪随机数
    *@authorzhjx922
    */classRand{private$_sRand;publicfunction__construct(){$this->_sRand = substr(microtime(true),-3);
    }/**
    * 种子生成器
    *@returnstring
    */privatefunctionsRand(){
    $a =33773;
    $b =97613;
    $m =65536;$this->_sRand = bcmod(bcadd(bcmul($a,$this->_sRand), $b), $m);return$this->_sRand;
    }/**
    * 查询随机数
    *@param$start
    *@param$end
    *@returnstring
    */publicfunctionrand($start, $end){if($start == $end) {return$start;
    }if($start > $end) {
    $max = $start;
    $min = $end;
    }else{
    $max = $end;
    $min = $start;
    }
    $sub = $max - $min;return(int)bcmod($this->sRand(), $sub +1) + $min;
    }
    }
$rand =newRand();
    $randNum =array();for($i=0;$i<10000;$i++) {
    $num = $rand->rand(-50,-66);if(isset($randNum[$num])) {
    $randNum[$num]++;
    }else{
    $randNum[$num] =1;
    }
    }
    ksort($randNum);
    var_dump($randNum);
大家可以复制代码到本地跑一下,看看生成的效果如何,生成的随机数是否足够"随机"
网站声明:文章内容来源于网络,本站不拥有所有权,请认真核实,谨慎使用,本站不承担相关法律责任。