您好,登錄后才能下訂單哦!
如何在php中取隨機(jī)數(shù)不重復(fù)?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
php取隨機(jī)數(shù)不重復(fù)的方法:1、使用【rand(min,max)】函數(shù)產(chǎn)生隨機(jī)數(shù);2、使用【array_unique(arr)】對(duì)生成的數(shù)組進(jìn)行去重;3、利用索引快速的生成不重復(fù)的隨機(jī)數(shù)。
php取隨機(jī)數(shù)不重復(fù)的方法:
首先想到的是rand(min,max)
函數(shù)產(chǎn)生隨機(jī)數(shù),實(shí)際上使用mt_rand(min,max)
能更加迅速的產(chǎn)生隨機(jī)數(shù)。
其次使用array_unique(arr)
對(duì)生成的數(shù)組進(jìn)行去重,實(shí)際上使用array_flip(array_flip(arr))
能更加快速的進(jìn)行去重。
了解以上兩點(diǎn)我們便可以寫一個(gè)稍微優(yōu)化過的函數(shù):
/** * 生成指定長(zhǎng)度不重復(fù)的字符串. * * @param integer $min 最小值. * @param integer $max 最大值. * @param integer $len 生成數(shù)組長(zhǎng)度. * * @return array */ function uniqueRandom($min, $max, $len) { if ($min < 0 || $max < 0 || $len) { throw new LogicException('無效的參數(shù)'); } if ($max <= $min) { throw new LogicException('大小傳入錯(cuò)誤'); } $counter = 0; $result = array(); while ($counter < $len) { $result[] = mt_rand($min, $max); $result = array_flip(array_flip($result)); $counter = count($result); } shuffle($result); return $result; }
其實(shí)可以利用索引來更加快速的生成不重復(fù)的隨機(jī)數(shù),且效率甩上面函數(shù)幾條街。
/** * 生成指定長(zhǎng)度不重復(fù)的字符串. * * @param integer $min 最小值. * @param integer $max 最大值. * @param integer $len 生成數(shù)組長(zhǎng)度. * * @return array */ function uniqueRandom2($min, $max, $len) { if ($min < 0 || $max < 0 || $len < 0) { throw new LogicException('無效的參數(shù)'); } if ($max <= $min) { throw new LogicException('大小傳入錯(cuò)誤'); } if (($max - $min + 2) < $len) { throw new LogicException("傳入的范圍不足以生成{$len}個(gè)不重復(fù)的隨機(jī)數(shù)}"); } $index = array(); for ($i = $min; $i < $max + 1; $i++) { $index[$i] = $i; } $startOne = current($index); $endOne = end($index); for ($i = $startOne; $i < $endOne; $i++) { $one = mt_rand($i, $max); if ($index[$i] == $i) { $index[$i] = $index[$one]; $index[$one] = $i; } } return array_slice($index, 0, $len); }
該算法與上面算法相比巧妙之處在于:
對(duì)自增索引進(jìn)行隨機(jī),不會(huì)有重復(fù)的問題,避免了去重的開銷
用數(shù)組下標(biāo)替代數(shù)組本身進(jìn)行隨機(jī),每取到一個(gè)隨機(jī)數(shù)后就將其在取值范圍中排除,下一次僅會(huì)在剩下的數(shù)字中取,一次遍歷就可以完成隨機(jī)數(shù)的選取。
看完上述內(nèi)容,你們掌握如何在php中取隨機(jī)數(shù)不重復(fù)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。