Random
Dernière réponse : dans Programmation
Ben voila, je voudrais faire un random de X nombres, mais sans que les nombre soit les mm...
J'ai deja ca, mais la il peut y avoir plusieurs fois le mm nombre... une idée?
J'ai deja ca, mais la il peut y avoir plusieurs fois le mm nombre... une idée?
for ($i=0;$i<=19;$i++)
{
$nbr[$i] = rand(1,$num);
echo $nbr[$i]."<br>";
Autres pages sur : random
Lassé par la pub ? Créez un compte
Voila, testé et fonctionnel. Avec en prime des commentaires d'explication.
<?php
$num = 20; //ou bien la valeur maximale que tu veux ton random
for ($i=0; $i<=19; $i++)
{
$nbr[$i] = rand(1,$num); //génère le chiffre
$existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
for ($j=0; $j<$i; $j++)
if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
$existe = true; //pour dire qu'il existe déja
if (!$existe) //si il n'existe pas
echo $nbr[$i]."<br>"; //l'afficher
else
$i--; //recommencer ce random
}
?>
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.
function RandomUnique($min, $max, $nombre)
{
//$min et $max sont les limites du random
//$nombre est le monbre de chiffres qu'on veut
for ($i=0; $i<=($nombre - 1); $i++)
{
$nbr[$i] = rand($min,$max); //génère le chiffre
$existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
for ($j=0; $j<$i; $j++)
if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
$existe = true; //pour dire qu'il existe déja
if (!$existe) //si il n'existe pas
echo $nbr[$i]."<br>"; //l'afficher
else
$i--; //recommencer ce random
}
}
je propose cette variante :
function RandomUnique($min, $max, $nombre)
{
//$min et $max sont les limites du random
//$nombre est le monbre de chiffres qu'on veut
$i=0;
do {
$j=$i;
$nbr[$i] = rand($min,$max); //génère le chiffre
$nbr = array_unique($nbr);
$i=count($nbr);
if ($i!=$j) {
echo $nbr[$j]."<br>"; //l'afficher
}
} while ($i<=$nombre);
}
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.
function RandomUnique($min, $max, $nombre)
{
//$min et $max sont les limites du random
//$nombre est le monbre de chiffres qu'on veut
for ($i=0; $i<=($nombre - 1); $i++)
{
$nbr[$i] = rand($min,$max); //génère le chiffre
$existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
for ($j=0; $j<$i; $j++)
if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
$existe = true; //pour dire qu'il existe déja
if (!$existe) //si il n'existe pas
echo $nbr[$i]."<br>"; //l'afficher
else
$i--; //recommencer ce random
}
}
légère opti de ton code :
function RandomUnique($min, $max, $nombre)
{
//$min et $max sont les limites du random
//$nombre est le monbre de chiffres qu'on veut
for ($i=0; $i<=($nombre - 1); $i++)
{
$nbr[$i] = rand($min,$max); //génère le chiffre
$existe = false; //pour dire que le nouveau chiffre n'existe pas dans le tableau
for ($j=0; $j<$i; $j++) {
if ($nbr[$i] == $nbr[$j]) //si le nouveau chiffre est égal a un ancien chiffre
{
$existe = true; //pour dire qu'il existe déja
break;
}
}
if (!$existe) //si il n'existe pas
echo $nbr[$i]."<br>"; //l'afficher
else
$i--; //recommencer ce random
}
}
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!)
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.
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!)
<?
function randomUnique($mini,$maxi,$quantite) {
$tableTemp=array();
$tableSortie=array();
for ($bcl=$mini; $bcl<=$maxi; $bcl++) {
array_push($tableTemp,$bcl);
}
for ($bcl=0;$bcl<$quantite;$bcl++) {
$alea=rand(0,count($tableTemp));
$tampon=array_splice($tableTemp,$alea,1);
array_push($tableSortie,$tampon[0]);
}
return ($tableSortie);
}
$tableAleatoire=randomUnique(100,200,10);
for ($bcl=0; $bcl<count($tableAleatoire); $bcl++) { echo($tableAleatoire[$bcl]."<br>"); }
?>
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
- Contenus similaires :
Tags :
- ForumRandom waypoint ns2
- ForumFonction random java
- ForumTricher au random wow
- ForumFonction random sous firefox
- ForumJavascript random image
- ForumAfficher element du tableau avec random
- articlesFreefile et fichiers random sous net compact
- ForumAfficher une image random tiree du web
- ForumPartage xp en random team sur frozen throne
- Voir plus