Tirer un nombre au hazard [Résolu]

Signaler
Messages postés
19
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
10 août 2014
-
Messages postés
19
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
10 août 2014
-
Bonjour
et bonne fêtes à tous !

je vous expose mon probléme !


je suis en train de créer un jeu-question !


je vais entrer dans un tableaux un nombre (10 pour commencer) qui correspondra une question , rep , etc


ex $test[0 ]---question 0, rep,soluce , etc ca, ca marche (je vais chercher dans une Bdd que j'ai crée)


Mon probléme j'arrive à faire une boucle for jusque 10 avec rand pour avoir 10 questions au hazard ,mais je n'arrive pas a faire le test pour qu'il ne reprenne pas le même nombre !


un de mes test

<?php
$i=0;
$test[0]=rand(1,10);
do
{
$i++;
$num = rand(1,10);



for ($a=0;count($test);$a++)
 {
  if ($test[$a]=$num)
  {
  echo 'test:',$test[$a],"
";
  break;
  }else{
  $test[$a]=$num;
  }
 }
}
while ($i<10);



?>





voila merci pour votre aide  

7 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Franchement je n'ai rien compris à ton code. Tu te compliques beaucoup la tâche.
Est ce que ce code réponds à ta demande ou il y a un truc que je n'ai pas capté ?

$nb_questions = 10;
$mem = array();
$i = 0;

do {
  if ($i >= $nb_questions) break;
  $rand = rand(1,$nb_questions);
  if (!in_array($rand, $mem)) {
    array_push($mem, $rand);
    echo 'question n°'.$rand.'
';
  } else continue;
  $i++;
} while (true);

Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Re,

$nb_questions = 10; // nombre total de questions
$mem = array(); // init du tableau qui contiendra les n° des questions déjà tirées
$i = 0; // init var permettant de sortir de la boucle

do {
  if ($i >= $nb_questions) break; // toutes les questions ont été tirées, on sort
  $rand = rand(1,$nb_questions); // num aléatoire entre 1 et le nb de questions disponibles
  if (!in_array($rand, $mem)) { // si le n° de la question n'a pas encore été tiré ($rand)
    array_push($mem, $rand); // on le rentre dans le tableau
    echo 'question n°'.$rand.'
'; // on pose la question
  } else continue; // le n° de question aléatoire a déjà été tiré, on continue avec un nouveau nombre aléatoire
  $i++; // incrémente le nombre de questions posées
} while (true);

Attention, ce script n'est valable que si tu n'as pas beaucoup de questions, car il perds du temps à chaque fois qu'il rencontre un nombre déjà tiré (dans ce cas là il refait une boucle (continue))

Je pense que le mieux est de faire ainsi :
$t = range(1, $nb_questions); // génère un tableau entre 1 et le nombre de questions dispo
$t = array_rand ($t); // mélange aléatoirement le tableau

foreach ($t as $k=>$v) { // pour chaque valeur du tableau
    echo 'question n°'.$v.'
'; // on pose la question correspondante
}

C'est beaucoup plus simple, beaucoup moins lourd et vraiment plus rapide.

Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Jette un oeil à ces 2 liens :
continue
do while

if (!in_array($rand, $mem)) {
[...]
} else continue;
$i++;

= > si le nombre a déjà été tiré (il est déjà dans le tableau $mem), on "continue", c'est à dire qu'on reboucle (do) sans exécuter le reste de la boucle ($i++)

while(true);
=> cette condition est toujours vrai, la sortie de la boucle do ne se fait pas par ce while, mais par le break.
Ca reviens au même que d'écrire ça :
} while ($i > $nb_questions); (et de supprimer le if($i>=...) de la boucle do)

Cordialement.

Kohntark -
Messages postés
19
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
10 août 2014

merci 
J'ai l'impression que oui !
Pourrais tu m'expliquer un peu ton code !
Car j'en comprend un peu mais j'ai l'impression que tout est condensé !
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Je viens de m'apercevoir qu'il y a une erreur d'inattention dans mon code, il faut remplacer :
$t = range(1, $nb_questions); // génère un tableau entre 1 et le nombre de questions dispo
$t = array_rand ($t); // mélange aléatoirement le tableau
par :
$tt = range(1, $nb_questions); // génère un tableau entre 1 et le nombre de questions dispo
$t = shuffle($tt); // mélange aléatoirement le tableau

Par curiosité je viens de faire un bench sur le premier et le seconde code :
Temps d'éxécution :

Pour 100 questions :
1er code :  0.00318 sec (341 nombres aléatoires déjà tiré = 341 boucles do pour rien)

2eme code : 0.00026 sec

Pour 10000 questions :
1er code :  14.25654 sec (21902 nombres aléatoires déjà tiré !!)
2eme code : 0.02322 sec

Cordialement,

Kohntark-
Messages postés
19
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
10 août 2014

Ouah !!!
merci pour ta réponse !
C'est triste mais je viens de m'apercevoir que vraiment j'ai du boulot en Php!!!
Mais d'un autre coté tant mieux !

Pour revenir au code :
je ne comprend pas :"else continue" , le continue , c'est une fonction ?

et aussi "while (true);" qu'est ce qui doit être vrai ?

Merci de prendre de temps ;)
Messages postés
19
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
10 août 2014

Merci pour tout !