Maison > Article > développement back-end > Comment générer des nombres aléatoires non répétitifs en php
Comment générer des nombres aléatoires non répétitifs en PHP : attribuez d'abord une valeur à chaque nombre du tableau dans l'ordre de son indice ; puis commencez à prendre des nombres aléatoires dans la plage de "[i, $num-1 ; ]"; enfin dans Effectuez simplement des opérations alternées sur les paires clé-valeur inchangées.
Recommandé : "Tutoriel vidéo PHP"
PHP génère efficacement un nombre aléatoire non répétitif
PHP génère une méthode d'encapsulation de tableau aléatoire non répétitive
/* * array unique_rand( int $min, int $max, int $num ) * 生成一定数量的不重复随机数 * $min 和 $max: 指定随机数的范围 * $num: 指定生成数量 */ function unique_rand($min, $max, $num) { //初始化变量为0 $count = 0; //建一个新数组 $return = array(); while ($count < $num) { //在一定范围内随机生成一个数放入数组中 $return[] = mt_rand($min, $max); //去除数组中的重复值用了“翻翻法”,就是用array_flip()把数组的key和value交换两次。这种做法比用 array_unique() 快得多。 $return = array_flip(array_flip($return)); //将数组的数量存入变量count中 $count = count($return); } //为数组赋予新的键名 shuffle($return); return $return; }
Cette méthode obtient des nombres aléatoires à chaque fois et les stocke dans le tableau avant de les dédupliquer... est inefficace .. Je ne veux pas utiliser
PHP génère efficacement m nombres aléatoires uniques dans la plage n (m
Remarque : cela est également mentionné dans le livre " Programming Pearls", le titre de "Comment générer efficacement m nombres aléatoires non répétitifs dans la plage de n (m
Cet algorithme prend très intelligemment la position du nombre aléatoire (l'indice du tableau), au lieu de prendre le nombre aléatoire lui-même, chaque fois qu'un nombre aléatoire est obtenu, il sera exclu de la plage de valeurs, et la prochaine fois, il ne sera pris que parmi les nombres restants. La sélection du nombre aléatoire peut être complétée. en une seule traversée, ce qui est assez efficace.
function rand_num($num='200'){ for($i=0;$i<$num;$i++){ $n[$i] = $i; } for($i=0;$i<$num;$i++){ $rand = mt_rand($i,$num-1); //数组 随机数交换下标 if($n[$i] == $i){ $n[$i] = $n[$rand]; $n[$rand] = $i; } } }
1. La première étape consiste à attribuer une valeur à chaque nombre du tableau dans l'ordre de son indice pour obtenir un tableau de valeurs de clés numériques $num disposées dans l'ordre correspondant.
2. Dans la deuxième étape, commencez à obtenir le nombre aléatoire $rand dans la plage [i, $num-1] et utilisez le nombre aléatoire obtenu $rand comme indice correspondant à la clé de position actuelle i dans le tableau Value $rand, remplacez la valeur correspondant à l'indice de la clé $rand dans le tableau par i. Il s'agit en fait d'un échange croisé de valeurs de clé de tableau. Le sens est d'exclure le nombre aléatoire généré de la plage de valeurs [i,$num-1], et la prochaine fois, il prendra la valeur des nombres restants [i+1,num-1].
3. La troisième étape, afin d'éviter les valeurs répétées, effectuez uniquement des opérations alternées sur les paires clé-valeur inchangées, c'est-à-dire effectuez des opérations alternées sur les positions de la séquence de tableau d'origine (clé == valeur ).
4. Fin.
Processus d'échange partiel de tableaux séquentiels
Comme indiqué ci-dessus, obtenez 10 exemples partiels de nombres aléatoires.
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!