溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在php中取隨機(jī)數(shù)不重復(fù)

發(fā)布時(shí)間:2020-07-23 16:58:13 來源:億速云 閱讀:199 作者:Leah 欄目:編程語(yǔ)言

如何在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è)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(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)容。

php
AI