Se connecter avec
S'enregistrer | Connectez-vous

Random

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte

javais pensé à faire ca, mais pitet qu'une fonction le faisait automatiquement...
Par contre si qqun voit comment faire cette boucle, ca m'aiderait parce que je me perd dans les boucle, etant donnée que j'en utilise deux et je dois foirée qq part car ca lance de ces truc sans fin :sweat: 

Voila, testé et fonctionnel. Avec en prime des commentaires d'explication.

  1. <?php
  2. $num = 20; //ou bien la valeur maximale que tu veux ton random
  3.  
  4. for ($i=0; $i<=19; $i++)
  5. {
  6. $nbr[$i] = rand(1,$num); //génère le chiffre
  7. $existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
  8. for ($j=0; $j<$i; $j++)
  9. if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
  10. $existe = true; //pour dire qu'il existe déja
  11. if (!$existe) //si il n'existe pas
  12. echo $nbr[$i]."<br>"; //l'afficher
  13. else
  14. $i--; //recommencer ce random
  15. }
  16. ?>

Tu m'as donné le goût d'aller plus loin. Je t'ai créé une petite fonction ! J'espère qu'elle te sera utile.

  1. function RandomUnique($min, $max, $nombre)
  2. {
  3. //$min et $max sont les limites du random
  4. //$nombre est le monbre de chiffres qu'on veut
  5. for ($i=0; $i<=($nombre - 1); $i++)
  6. {
  7. $nbr[$i] = rand($min,$max); //génère le chiffre
  8. $existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
  9. for ($j=0; $j<$i; $j++)
  10. if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
  11. $existe = true; //pour dire qu'il existe déja
  12. if (!$existe) //si il n'existe pas
  13. echo $nbr[$i]."<br>"; //l'afficher
  14. else
  15. $i--; //recommencer ce random
  16. }
  17. }

je propose cette variante :

  1. function RandomUnique($min, $max, $nombre)
  2. {
  3. //$min et $max sont les limites du random
  4. //$nombre est le monbre de chiffres qu'on veut
  5. $i=0;
  6. do {
  7. $j=$i;
  8. $nbr[$i] = rand($min,$max); //génère le chiffre
  9. $nbr = array_unique($nbr);
  10. $i=count($nbr);
  11. if ($i!=$j) {
  12. echo $nbr[$j]."<br>"; //l'afficher
  13. }
  14. } while ($i<=$nombre);
  15. }

ThripS a écritTu m'as donné le goût d'aller plus loin. Je t'ai créé une petite fonction ! J'espère qu'elle te sera utile.

  1. function RandomUnique($min, $max, $nombre)
  2. {
  3. //$min et $max sont les limites du random
  4. //$nombre est le monbre de chiffres qu'on veut
  5. for ($i=0; $i<=($nombre - 1); $i++)
  6. {
  7. $nbr[$i] = rand($min,$max); //génère le chiffre
  8. $existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
  9. for ($j=0; $j<$i; $j++)
  10. if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
  11. $existe = true; //pour dire qu'il existe déja
  12. if (!$existe) //si il n'existe pas
  13. echo $nbr[$i]."<br>"; //l'afficher
  14. else
  15. $i--; //recommencer ce random
  16. }
  17. }



légère opti de ton code :

  1. function RandomUnique($min, $max, $nombre)
  2. {
  3. //$min et $max sont les limites du random
  4. //$nombre est le monbre de chiffres qu'on veut
  5. for ($i=0; $i<=($nombre - 1); $i++)
  6. {
  7. $nbr[$i] = rand($min,$max); //génère le chiffre
  8. $existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
  9. for ($j=0; $j<$i; $j++) {
  10. if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
  11. {
  12. $existe = true; //pour dire qu'il existe déja
  13. break;
  14. }
  15. }
  16. if (!$existe) //si il n'existe pas
  17. echo $nbr[$i]."<br>"; //l'afficher
  18. else
  19. $i--; //recommencer ce random
  20. }
  21. }

salut,

le problème avec une boucle de test d'existence est que, pour des plages réduites de possibilités, la probabilité de tomber aléatoirement sur un nombre déjà sorti est très grande, ce qui oblige ta boucle a se répéter un très grand nombre de fois pour rien.

Sur des petites plages de possibilités ou des plages moyennes, personnellement j'utilise un tableau des valeurs possibles.

Voici, rapidement, le code correspondant (à améliorer!)

  1. <?
  2. function randomUnique($mini,$maxi,$quantite) {
  3. $tableTemp=array();
  4. $tableSortie=array();
  5. for ($bcl=$mini; $bcl<=$maxi; $bcl++) {
  6. array_push($tableTemp,$bcl);
  7. }
  8. for ($bcl=0;$bcl<$quantite;$bcl++) {
  9. $alea=rand(0,count($tableTemp));
  10. $tampon=array_splice($tableTemp,$alea,1);
  11. array_push($tableSortie,$tampon[0]);
  12. }
  13. return ($tableSortie);
  14. }
  15.  
  16. $tableAleatoire=randomUnique(100,200,10);
  17. for ($bcl=0; $bcl<count($tableAleatoire); $bcl++) { echo($tableAleatoire[$bcl]."<br>"); }
  18. ?>


La fonction attend 3 valeurs :
$mini : la valeur minimale de la plage des possibilités
$maxi : la valeur maximale de la plage des possibilités
$quantité : le nombre de tirages que l'on souhaite

dans un premier temps je crée un tableau temporaire qui va contenir TOUTE la plage des possibilités, de la valeur mini à la valeur maxi, dans l'ordre.

il ne me reste plus qu'à faire une boucle sur la quantité de tirages que je souhaite;
cette boucle défini un nombre aléatoire compris entre 0 et la taille du tableauTemporaire
j'extrait alors la valeur contenue par le tableauTemporaire à l'indexe aléatoire que je viens d'obtenir.
je sauvegarde cette valeur dans un tableau de sortie

mon tableau temporaire est réduit d'une valeur, le nombre extrait ne fait plus partie du tableau, la boucle suivante ne risque donc pas de tomber de nouveau sur cette valeur

j'ai tapé rapidement le code en exemple, il faudrait l'améliorer et le rendre plus propre. Il faudrait, entre autre, vérifier que la quantité n'est pas supérieure à la taille de la plage des possibilités. Il faudrait également libérer la mémoire utilisée par les tableaux provisoires ...

Il est clair que cette solution n'est adaptée qu'à des plages relativement réduites de possibilités.
Pour des plages plus importantes (plusieurs milliers), la probabilité de tomber de fois de suite aléatoirement sur un même nombre est réduite, la solution du test de l'existence est très certainement adaptée.

Voilà,
en espérant n'avoir pas plus de deux ans de retard sur la question ;-) ,
Clo.
Lassé par la pub ? Créez un compte