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 :
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('无效的参数'); } if ($max <= $min) { throw new LogicException('大小传入错误'); } $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('无效的参数'); } if ($max <= $min) { throw new LogicException('大小传入错误'); } 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.
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!