lolosav
Messages postés19Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention10 août 2014
-
27 déc. 2008 à 18:53
lolosav
Messages postés19Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention10 août 2014
-
28 déc. 2008 à 15:17
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);
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 27 déc. 2008 à 19:31
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);
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 27 déc. 2008 à 20:34
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.
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)
kohntark
Messages postés3705Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 27 déc. 2008 à 21:18
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