隨機(jī)數(shù)函數(shù)rand大家一定都使用得爐火純青了,但是如何你想自己實現(xiàn)一個rand函數(shù)該怎么辦呢?這篇文章讓我來簡單介紹一下隨機(jī)數(shù)的常用生成方法
最近工作太忙,幾乎沒精力寫文章,竟然有人催更,好在這段時間也沒人取關(guān),哈哈,那就小更一篇吧。
真假隨機(jī)數(shù)
其實計算機(jī)中的隨機(jī)數(shù)都是偽隨機(jī)數(shù),因為它并不是真正隨機(jī)的。只有完全無法預(yù)測下一次的數(shù)字才能算是真正的隨機(jī)數(shù)。相抵比較”真隨機(jī)”的方法有:通過當(dāng)前溫度+PM2.5+風(fēng)力…、CPU溫度+內(nèi)存條溫度+…。重點(diǎn)在于無法預(yù)測,但是這些隨機(jī)數(shù)獲取的成本也相對比較大。
線性同余法
大部分語言的隨機(jī)數(shù)都是通過”線性同余法”生成的,這是什么鬼方程(哪位好學(xué)生給科普一下)?我們不管原理,只管實現(xiàn)~線性同余法的方程為:N2 = (A X N1 + B) % M,僅當(dāng)B能夠被A與M的最大公約數(shù)整除,此方程有解。我們只要保證A和M互質(zhì)就可以了。
下面是我用PHP的簡單實現(xiàn),如有錯誤,隨便指出:
/** * 偽隨機(jī)數(shù) * @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; } /** * 查詢隨機(jī)數(shù) * @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;$irand(-50, -66); if(isset($randNum[$num])) { $randNum[$num]++; } else { $randNum[$num] = 1; }}ksort($randNum);var_dump($randNum);
大家可以復(fù)制代碼到本地跑一下,看看生成的效果如何,生成的隨機(jī)數(shù)是否足夠”隨機(jī)”