9
votes

Obtenez une valeur aléatoire à partir d'un tableau PHP, mais faites-la unique

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.

Si je le sélectionne 10 fois à partir du même réseau de 4 éléments, alors évidemment certaines valeurs seront dupliquées.

J'ai ceci en ce moment, Mais je reçois toujours des valeurs en double, même si la boucle fonctionne 4 fois: xxx


3 commentaires

Sur une note latérale, NSfoTools.com/misc/dilbertrandom.gif


Pourquoi n'utilisez-vous pas array_rand ($ arr_history, 4) 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é]); semble traiter $ arr_history en tant que tableau associatif, car $ sélectionné est la valeur, pas l'index. Cela ne résout pas le problème, cependant. Détectionner $ sélectionné 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)


9 Réponses :


7
votes

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;
}


0 commentaires

2
votes

clé! = valeur, utilisez ceci: xxx


0 commentaires

1
votes

J'ai fait cela pour créer un mot de passe aléatoire à 8 chiffres pour les utilisateurs: xxx


3 commentaires

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é!



12
votes

Vous avez presque raison. Le problème était le nonset ($ arr_history [$ sélectionné]); ligne. La valeur de $ sélectionnée n'est pas une clé, mais en fait une valeur, donc le non défini ne fonctionnerait pas.

Pour le garder de la même manière que ce que vous avez là-haut: < Pré> xxx

ou un exemple avec quelques petites lignes: xxx


3 commentaires

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



3
votes

php a une fonction native appelée shuffle que vous pouvez utiliser pour commander aléatoirement les éléments de la matrice. Alors qu'en est-il de cela? XXX


1 commentaires

shuffle retourne réellement un booléen et modifie le tableau d'origine afin que vous souhaitiez foreach ($ arr tant d $ a)



1
votes

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.

Implémentation LCG

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.

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.


0 commentaires

4
votes

-1
votes

facile et propre: xxx


0 commentaires

1
votes
$isShowCategory = array();
for ($i=0; $i <5 ; $i++) { 
   $myCategory = array_rand($arrTrCategoryApp,1); 
   if (!in_array($myCategory, $isShowCategory)) {
      $isShowCategory[] = $myCategory;

      #do something 

   }
}

1 commentaires

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.