Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bekomme ich Zufallszahlen ohne Wiederholung in PHP?

Wie bekomme ich Zufallszahlen ohne Wiederholung in PHP?

coldplay.xixi
coldplay.xixiOriginal
2020-07-23 13:35:453691Durchsuche

So erhalten Sie sich nicht wiederholende Zufallszahlen in PHP: 1. Verwenden Sie die Funktion [rand(min,max)], um Zufallszahlen zu generieren. 2. Verwenden Sie [array_unique(arr)], um das generierte Array zu deduplizieren. 3. Verwenden Sie Indizes, um schnell eindeutige Zufallszahlen zu generieren.

Wie bekomme ich Zufallszahlen ohne Wiederholung in PHP?

So erhalten Sie Zufallszahlen ohne Wiederholung in PHP:

Das erste, was mir in den Sinn kommt, ist das rand(min,max)-Funktion, die Zufallszahlen generiert. Tatsächlich kann die Verwendung von mt_rand(min,max) Zufallszahlen schneller generieren.

Zweitens: Verwenden Sie array_unique(arr), um das generierte Array zu deduplizieren. Tatsächlich kann die Verwendung von array_flip(array_flip(arr)) die Deduplizierung beschleunigen.

Wenn wir die beiden oben genannten Punkte verstehen, können wir eine leicht optimierte Funktion schreiben:

/**
 * 生成指定长度不重复的字符串.
 *
 * @param integer $min 最小值.
 * @param integer $max 最大值.
 * @param integer $len 生成数组长度.
 *
 * @return array
 */
function uniqueRandom($min, $max, $len)
{
    if ($min < 0 || $max < 0 || $len) {
        throw new LogicException(&#39;无效的参数&#39;);
    }
    if ($max <= $min) {
        throw new LogicException(&#39;大小传入错误&#39;);
    }
    $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;
}

Tatsächlich können Sie Indizes verwenden, um eindeutige Zufallszahlen schneller zu generieren, und die Effizienz ist um ein Vielfaches besser als die obige Funktion.

/**
 * 生成指定长度不重复的字符串.
 *
 * @param integer $min 最小值.
 * @param integer $max 最大值.
 * @param integer $len 生成数组长度.
 *
 * @return array
 */
function uniqueRandom2($min, $max, $len)
{
    if ($min < 0 || $max < 0 || $len < 0) {
        throw new LogicException(&#39;无效的参数&#39;);
    }
    if ($max <= $min) {
        throw new LogicException(&#39;大小传入错误&#39;);
    }
    if (($max - $min + 2) < $len) {
        throw new LogicException("传入的范围不足以生成{$len}个不重复的随机数}");
    }
    $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);
}

Die Cleverness dieses Algorithmus im Vergleich zum obigen Algorithmus ist:

  • Randomisieren Sie den sich selbst erhöhenden Index, es wird kein Duplizierungsproblem geben und der Deduplizierungsprozess wird es tun vermieden werden. Overhead

  • Verwenden Sie den Array-Index, um das Array selbst für die Randomisierung zu ersetzen. Beim nächsten Mal wird es aus dem Wertebereich ausgeschlossen Die Auswahl der Zufallszahlen kann nur in einem Durchlauf abgeschlossen werden.

Verwandte Lernempfehlungen: PHP-Programmierung vom Einstieg bis zur Beherrschung

Das obige ist der detaillierte Inhalt vonWie bekomme ich Zufallszahlen ohne Wiederholung in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn