Je souhaite sélectionner une valeur aléatoire à partir d'une matrice, mais le garder unique aussi longtemps que possible.
Par exemple, si je sélectionne une valeur 4 fois à partir d'une matrice de 4 éléments, la valeur sélectionnée doit être aléatoire. , mais différent à chaque fois. p>
Si je le sélectionne 10 fois à partir du même réseau de 4 éléments, alors évidemment certaines valeurs seront dupliquées. P>
J'ai ceci en ce moment, Mais je reçois toujours des valeurs en double, même si la boucle fonctionne 4 fois: p>
9 Réponses :
Que diriez-vous de mélanger la matrice et de faire des articles sur les éléments.
Lorsque POP code> renvoie null code>, réinitialiser le tableau. P> $orig = array(..);
$temp = $orig;
shuffle( $temp );
function getNextValue()
{
global $orig;
global $temp;
$val = array_pop( $temp );
if (is_null($val))
{
$temp = $orig;
shuffle( $temp );
$val = getNextValue();
}
return $val;
}
clé! = valeur, utilisez ceci:
J'ai fait cela pour créer un mot de passe aléatoire à 8 chiffres pour les utilisateurs:
Et vous n'obtenez pas du tout des caractères en double?
Ou juste: substrateur (Str_shuffle ('abcdefghijklmnopqrstuvwxyz0123456789'), 0, 8) qui serait moins cher.
@ALEX - oui vous faites. @Leif - C'est mieux que vous avez raison, merci pour la perspicacité!
Vous avez presque raison. Le problème était le Pour le garder de la même manière que ce que vous avez là-haut: P> < Pré> xxx pré> ou un exemple avec quelques petites lignes: p> nonset ($ arr_history [$ sélectionné]); code> ligne. La valeur de $ sélectionnée code> n'est pas une clé, mais en fait une valeur, donc le non défini ne fonctionnerait pas.
Merci cela semble fonctionner, mais c'est bizarre qu'un tableau comme celui-ci a des clés. Je pensais que la clé et la valeur serait la même
@ALEX - Non, en fait, lorsque vous ne spécifiez pas les touches, PHP les attribue aux touches numériques à partir de 0. Voir la section Paramètres de http://ca3.php.net/manual/fr/function.array.php Pour plus d'informations.
C'est toujours le même résultat, pas de hasard
php a une fonction native appelée shuffle code> que vous pouvez utiliser pour commander aléatoirement les éléments de la matrice. Alors qu'en est-il de cela?
shuffle code> retourne réellement un booléen et modifie le tableau d'origine afin que vous souhaitiez foreach ($ arr tant d $ a) code>
Si vous ne vous souciez pas de quelles valeurs particulières sont dans la matrice, vous pouvez essayer de mettre en place un générateur confortable linéaire afin de générer toutes les valeurs de la matrice. P>
Wikipedia répertorie certaines valeurs que vous pouvez utiliser et les règles pour sélectionner les valeurs de l'algorithme LCG, car l'algorith de LCG est déterministe qu'il est garanti de ne pas répéter une seule valeur avant la longueur de la période. P>
Après avoir rempli le tableau avec ces numéros uniques, vous pouvez simplement obtenir les numéros dans le tableau 1 par 1 en ordre. P>
facile et propre:
$isShowCategory = array();
for ($i=0; $i <5 ; $i++) {
$myCategory = array_rand($arrTrCategoryApp,1);
if (!in_array($myCategory, $isShowCategory)) {
$isShowCategory[] = $myCategory;
#do something
}
}
Ajout d'un certain contexte autour de votre réponse (par exemple, pourquoi cela résout le problème) aiderait les autres personnes à regarder la réponse.
Sur une note latérale, NSfoTools.com/misc/dilbertrandom.gif
Pourquoi n'utilisez-vous pas
array_rand ($ arr_history, 4) code> pour obtenir le tableau dans un ordre aléatoire? Cela garantit que vous avez 4 valeurs uniques. Dans la prochaine itération, vous obtenez le tableau dans un ordre différent.L'énoncé
nonset ($ arr_history [$ sélectionné]); code> semble traiter$ arr_history code> en tant que tableau associatif, car$ sélectionné code> est la valeur, pas l'index. Cela ne résout pas le problème, cependant. Détectionner$ sélectionné code> est censé le supprimer de la matrice, ce qui implique qu'au moment de la boucle effectuée, le tableau est vide. Était-ce votre intention? (Je ne le pense pas)