Un chiffre aléatoire mais uniquement dans une boucle php

WRInaute impliqué
Bonjour,

je souhaite afficher 5 lignes de code php. Pour cela je fais appel à une boucle while. Dans cette boucle, je souhaite que chaque ligne possède un chiffre aléatoire avec un rand(). Jusqu’à présent, j'ai parfois 2 chiffres identique dans mes 5 lignes. Comment faire pour avoir 5 chiffres différents et ne pas me retrouver comme actuellement avec 2, 3, 4 ou 5 chiffres identique ?

Code:
while ($nb <= 5)
{
    $pic = rand(1, 15);
     
    $page .='test : '.$pic.'<br><br>';
    $nb++;
}

Merci d'avance
 
WRInaute accro
PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />$numbers&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">range</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">15</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$randomKeys&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">array_rand</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$numbers</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">5</span><span class="syntaxkeyword">);<br />foreach&nbsp;(</span><span class="syntaxdefault">$randomKeys&nbsp;</span><span class="syntaxkeyword">as&nbsp;</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="syntaxdefault">$numbers</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">]&nbsp;.&nbsp;</span><span class="syntaxdefault">PHP_EOL</span><span class="syntaxkeyword">;<br />}&nbsp;</span><span class="syntaxdefault"></span>
 
WRInaute accro
Pour ton premier chiffre aléatoire il n'y a pas de problème.
Pour le deuxième il faut continuer à boucler sur la génération d'un chiffre aléatoire s'il est identique au premier
Pour le troisième il faut continuer à boucler sur la génération d'un chiffre aléatoire s'il est identique au premier ou au deuxième
Pour le quatrième il faut continuer à boucler sur la génération d'un chiffre aléatoire s'il est identique au premier ou au deuxième ou au troisième
Bien sur, il faut ceci seulement si le nombre maximum pour la génération de chiffre aléatoire est bien supérieur à 3 car sinon tu entres dans des boucles infinies.
 
WRInaute impliqué
Et pour le fun :
Au lieu de 5 valeurs distinctes entre 1 et 15, vous devez trouver 50.000 valeurs distinctes entre 1 et 1 million.
Quelle est la méthode la plus rapide (en restant raisonnable niveau mémoire) ?
^_^
 
WRInaute accro
et les tables temporaires ?
C'est directement géré par le SQL. Chaque nombre aléatoire tu commence par accéder à la table temporaire pour vérifier qu'il n'existe pas et ensuite tu le stocke dans la table temporaire
Mais je n'ai jamais utilisé les tables temporaires. C'est juste une idée
 
WRInaute passionné
colonies a dit:
Au lieu de 5 valeurs distinctes entre 1 et 15, vous devez trouver 50.000 valeurs distinctes entre 1 et 1 million.

Est-ce rapide ? Mais il faut créer un gros array :

Code:
$hasard = range(1,1000000);
shuffle($hasard);
$hasard = array_slice($hasard, -50000);

Ca peut s'écrire en une ligne :
Code:
$hasard = array_rand(range(1,1000000), 50000);
 
WRInaute passionné
Bon, en cherchant sur Google en fait il paraît qu'il vaut mieux ça pour la mémoire :
Code:
$hasard = array();
while(count($hasard) != 50000) {
 $hasard[rand(1, 1000000)] = 1;
}
$hasard = array_keys($hasard);
 
WRInaute impliqué
FortTrafic a dit:
Bon, en cherchant sur Google en fait il paraît qu'il vaut mieux ça pour la mémoire :
Code:
$hasard = array();
while(count($hasard) != 50000) {
 $hasard[rand(1, 1000000)] = 1;
}
$hasard = array_keys($hasard);
Oui c'est mieux niveau mémoire, la consommation étant proportionnelle avec le nombre d'éléments à trouver plutôt que l'intervalle des valeurs possibles (20x moins).
Par contre niveau vitesse, il y a moyen de faire plus de 10x plus rapide ;-)
 
WRInaute passionné
Utiliser mt_rand() au lieu de rand() ? La doc PHP dit que c'est 4 fois plus rapide. :)

J'ai lu aussi qu'utiliser mt_rand() est plus rapide qu'utiliser mt_rand(X,Y)... donc est-ce que tu veux dire un truc comme ça ?
Code:
$hasard = array();
while(count($hasard) != 50000) {
 $hasard[substr(mt_rand(),0,6)+1] = 1;
}
$hasard = array_keys($hasard);

J'ai mesuré les deux façons et celle-çi est plus lente.
 
WRInaute passionné
Je veux dire j'ai mesuré les deux façons entre utiliser mt_rand(1,1000000) et substr(mt_rand(),0,6)+1 et la deuxième est plus lente.
Sinon entre rand(1,1000000) et mt_rand(1,1000000) c'est bien mt_rand le plus rapide.

Ca doit être autre chose que tu as en tête :)
 
WRInaute impliqué
FortTrafic a dit:
Utiliser mt_rand() au lieu de rand() ? La doc PHP dit que c'est 4 fois plus rapide. :)
Que la fonction libc mais pas que rand(). J'ai l'impression que l'une est l'alias de l'autre car quand je fais un bench, les deux prennent exactement le même temps.

Ma technique :
Code:
$pics = [];
for ($j = 0; $j < 5000; $j++)
{
	do
		$pic = mt_rand(1, 1000000);
	while (isset($pics[$pic]));
	$pics[$pic] = 1;
}
$pics = array_keys($pics);
Dans le principe c'est proche de la version que tu avais partagée après ta recherche Google. La différence de perfs vient du fait qu'il n'y a pas de count() qui est assez lent : on essaye une valeur aléatoire, si c'est une nouvelle c'est bon, sinon on en cherche une autre aussitôt.

Bon après c'est pas une technique universellement plus rapide (ça l'est quand le nombre de valeurs à trouver est bien inférieur au range), c'était juste pour le fun.
 
Discussions similaires
Haut