Maison  >  Article  >  développement back-end  >  Comment obtenir des nombres aléatoires sans répétition en php ?

Comment obtenir des nombres aléatoires sans répétition en php ?

coldplay.xixi
coldplay.xixioriginal
2020-07-23 13:35:453691parcourir

Comment obtenir des nombres aléatoires en PHP sans duplication : 1. Utilisez la fonction [rand(min,max)] pour générer des nombres aléatoires ; 2. Utilisez [array_unique(arr)] pour dédupliquer le tableau généré 3 ; . Utilisez des index pour générer rapidement des nombres aléatoires uniques.

Comment obtenir des nombres aléatoires sans répétition en php ?

Comment obtenir des nombres aléatoires sans répétition en PHP :

La première chose qui me vient à l'esprit est le rand(min,max) fonction qui génère des nombres aléatoires, en fait, utiliser mt_rand(min,max) peut générer des nombres aléatoires plus rapidement.

Deuxièmement, utilisez array_unique(arr) pour dédupliquer le tableau généré. En fait, utiliser array_flip(array_flip(arr)) peut le dédupliquer plus rapidement.

Comprenant les deux points ci-dessus, nous pouvons écrire une fonction légèrement optimisée :

/**
 * 生成指定长度不重复的字符串.
 *
 * @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;
}

En fait, vous pouvez utiliser des index pour générer des nombres aléatoires uniques plus rapidement, et l'efficacité est plusieurs fois meilleure que la fonction ci-dessus.

/**
 * 生成指定长度不重复的字符串.
 *
 * @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);
}

L'intelligence de cet algorithme par rapport à l'algorithme ci-dessus est :

  • Randomisez l'index auto-croissant, il n'y aura pas de problème de duplication et le processus de déduplication sera être évité. n'être inclus que dans les nombres restants Récupération, la sélection de nombres aléatoires peut être complétée en un seul parcours.

  • Recommandations d'apprentissage associées :
  • Programmation PHP de l'entrée à la maîtrise

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn