1
随机数函数rand大家一定都使用的炉火纯青了,但是如何你想自己实现一个rand函数该怎么办呢?这篇文章让我来简单介绍一下随机数的常用生成方法

最近工作太忙,几乎没精力写文章,竟然有人催更,好在这段时间也没人取关,哈哈,那就小更一篇吧。

真假随机数

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

线性同余法

大部分语言的随机数都是通过"线性同余法"生成的,这是什么鬼方程(哪位好学生给科普一下)?我们不管原理,只管实现~
线性同余法的方程为:N2 = (A X N1 + B) % 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(), $sub + 1) + $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);

大家可以复制代码到本地跑一下,看看生成的效果如何,生成的随机数是否足够"随机"

关注公众号,一起学习成长~

xysy.jpg


zhjx922
1.3k 声望120 粉丝

骑驴十三载,不知火烧是何味


引用和评论

0 条评论