自己实现随机数

随机数函数rand大家一定都使用得炉火纯青了,但是如何你想自己实现一个rand函数该怎么办呢?这篇文章让我来简单介绍一下随机数的常用生成方法
最近工作太忙,几乎没精力写文章,竟然有人催更,好在这段时间也没人取关,哈哈,那就小更一篇吧 。

真假随机数

其实计算机中的随机数都是伪随机数,因为它并不是真正随机的 。只有完全无法预测下一次的数字才能算是真正的随机数 。
相抵比较"真随机"的方法有:通过当前温度 PM2.5 风力...、CPU温度 内存条温度 ... 。重点在于无法预测,但是这些随机数获取的成本也相对比较大 。

线性同余法

【自己实现随机数】大部分语言的随机数都是通过"线性同余法"生成的 , 这是什么鬼方程(哪位好学生给科普一下)?我们不管原理,只管实现~
线性同余法的方程为:N2 = (A X N1B) % M,仅当B能够被A与M的最大公约数整除,此方程有解 。我们只要保证A和M互质就可以了 。
下面是我用PHP的简单实现,如有错误,随便指出:
/** * 伪随机数 * @author zhjx922 */class Rand {private $_sRand;public function __construct(){$this->_sRand = substr(microtime(true), -3);}/*** 种子生成器* @return string*/private function sRand() {$a = 33773;$b = 97613;$m = 65536;$this->_sRand = bcmod(bcadd(bcmul($a, $this->_sRand), $b), $m);return $this->_sRand;}/*** 查询随机数* @param $start* @param $end* @return string*/public function rand($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(), $sub1)$min;}}$rand = new Rand();$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);
大家可以复制代码到本地跑一下,看看生成的效果如何,生成的随机数是否足够"随机"



相关经验推荐