Bonjour,
Je suis actuellement entrain de voir pour la méthode, ou l'algorithme qui serait le plus rapide concernant le tirage au sort de n nombre dans un ensemble A de p nombre.
Le problème étant simplement que la fonction mt_rand() (ou même rand()) se fait "avec remise". (du moins de se que j'en sais)).
Donc la question serait, admettons qu'on est:
Ensemble A = {1, 2, 3...28, 29, 30}
et qu'on fasse une boucle qui doit tourner jusqu'à sortir 20 nombres différent de l'ensemble A.
Comment faire pour restreindre l'ensemble A en retirant les nombres qui sont sortie au tour de boucle précédente?
--------------------------------------------- Mauvaise Méthode ---------------------------------------------
Alors certains pourraient me dire, tu peux faire comme ça (voir-ci dessous):
Le problème de ce genre d'algorithme est qu'il y a beaucoup de tour de boucle qui ne serve à rien!
Car plus on tire des "bon" numéro, moins il y en a de disponible, plus les probabilité que le rand() trouve un nombre déjà tiré est grand => tour de boucle inutile augmente.
Je suis actuellement entrain de voir pour la méthode, ou l'algorithme qui serait le plus rapide concernant le tirage au sort de n nombre dans un ensemble A de p nombre.
Le problème étant simplement que la fonction mt_rand() (ou même rand()) se fait "avec remise". (du moins de se que j'en sais)).
Donc la question serait, admettons qu'on est:
Ensemble A = {1, 2, 3...28, 29, 30}
et qu'on fasse une boucle qui doit tourner jusqu'à sortir 20 nombres différent de l'ensemble A.
Comment faire pour restreindre l'ensemble A en retirant les nombres qui sont sortie au tour de boucle précédente?
--------------------------------------------- Mauvaise Méthode ---------------------------------------------
Alors certains pourraient me dire, tu peux faire comme ça (voir-ci dessous):
Le problème de ce genre d'algorithme est qu'il y a beaucoup de tour de boucle qui ne serve à rien!
Car plus on tire des "bon" numéro, moins il y en a de disponible, plus les probabilité que le rand() trouve un nombre déjà tiré est grand => tour de boucle inutile augmente.
Code PHP :
<?php
$i=0;
while($i<20)
{
$rand = mt_rand(1,30);
//si il y a rien dans la case <=> dispo
if($dispo[$rand]==0)
{
$dispo[$rand] = 1; //on le rend indisponible
$tab[] = $rand; // on conserve le nombre tiré
$i++;
}
else $i--; //sinon on recommence
}
--------------------------------------------- Méthode 1 ---------------------------------------------
Cela consiste à réduire l'ensemble A en réduisant le nombre de case du tableau, en suppriment les éléments déjà tirés.
Code PHP :
<?php
$dispo= array(1,2,3....28,29,30);//on remplirais notre tableau différemment si on le coder vraiment.
$i=0;
while($i<20)
{
$rand = mt_rand(1, count($dispo)); //on tire entre 1 et la taille de notre tableau.
$tab[] = $rand; // on conserve le nombre tiré
$a = $rand;
while($a<=count($dispo))
{
if($a == count($dispo)) unset($dispo[$a]); //on détruit le dernier élément du tableau pour avoir le bon nombre d'élément au prochain tour de boucle
else $dispo[$a] = $dispo[$a+1]; //on décale notre tableau vers la gauche
$a++;
}
$i++;
}