TABLEAU DE NOMBRES ENTIERS ALÉATOIRES, TOUS DIFFÉRENTS OU NON, COMPRIS OU NON DA
cs_garfield90
Messages postés388Date d'inscriptionlundi 7 juillet 2003StatutWebmasterDernière intervention10 février 2009
-
6 avril 2007 à 11:28
BreakingCentral
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention 9 avril 2007
-
9 avril 2007 à 02:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Mais je comprend pas trop ce code...
Si je veux faire une playlist en random, je fais plutot :
<?php
//Init
$array = array();
$max_songs = 10;
// Remplissage du tableau
for ($i=0; $i<$max_songs; $i++)
$array[$i] = $i+1;
// Mélange du tableau
shuffle($array);
// Affichage
foreach($array as $key=>$val)
echo $key.' => '.$val.'
';
Et pis c'est tout :)
BreakingCentral
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention 9 avril 2007 7 avril 2007 à 17:47
C'est pas faux :D
Je viens de rectifier ça ^^
cs_garfield90
Messages postés388Date d'inscriptionlundi 7 juillet 2003StatutWebmasterDernière intervention10 février 2009 7 avril 2007 à 11:01
oki, mais tu peux supprimer use_range car tu l'utilise si et seulement si from et to sont renseignés et différent
en gros
si ( $from >= 0 && $to >=0 && $from!=$to )
generer_aleatoire($from, $to)
sinon
generer_aletoire();
ca ne sert a rien de renseigner use_range a false et from/to en meme temps
BreakingCentral
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention 9 avril 2007 7 avril 2007 à 02:16
J'ai testé cette nouvelle version et ça marche.
J'ai remplacé l'ancienne par celle-là dans la source.
BreakingCentral
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention 9 avril 2007 7 avril 2007 à 02:05
Ah j'ai peut-être trouvé !
Si je mettais ça ?
do
{
$n = get_random_integer( TRUE, $from, $to);
}
while ( (in_array( $n, $array)) && ($exclusive));
BreakingCentral
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention 9 avril 2007 7 avril 2007 à 02:01
La variable $use_range ne sert pas à déterminer si $from et $to sont des entiers positifs différents, mais à choisir si l'on veut générer un nombre compris dans l'intervalle [ $from; $to], ou bien un nombre au hasard ;D
Par contre, je ne comprends pas la condition de ta boucle :
1. $exclusive ne change jamais donc renvoie tjs la même valeur !
2. c'est le temps que $n EST dans le tableau qu'il faut itérer, donc j'aurais pas mis le " ! "...
Moi j'aurai plutôt fait :
if ($exclusive)
do
{
$n = get_random_integer( TRUE, $from, $to);
}
while ( in_array( $n, $array));
else $n = get_random_integer( TRUE, $from, $to);
Mais là, on retombe sur deux appels à get_random_integer...
cs_garfield90
Messages postés388Date d'inscriptionlundi 7 juillet 2003StatutWebmasterDernière intervention10 février 2009 7 avril 2007 à 01:05
Avec l'utilisation de constante, je suis pas sur que tu gagnes en rapidité ou alors un pouilleme que tu perds en portabilité.
Concernant le transtypage, c'est bien ca, cependant je vois pas l'interet de ta variable $use_range, tu le sais si $from et $to sont des entiers numeriques positifs différents
je l'écrirai plus avec un do..while, ca m'evites d'ecrire 2 fois get_random_integer ;)
do{
$n = get_random_integer( TRUE, $from, $to);
}while( (!in_array($n, $array)&&$exclusif) || !$exclusif );
BreakingCentral
Messages postés11Date d'inscriptionmercredi 14 mars 2007StatutMembreDernière intervention 9 avril 2007 6 avril 2007 à 18:57
J'avais mis des constantes pour gagner en rapidité, mais c'est vrai que ce n'est pas forcément pratique.
Pour le transtypage, c'est bien ça ?
@+
cs_garfield90
Messages postés388Date d'inscriptionlundi 7 juillet 2003StatutWebmasterDernière intervention10 février 2009 6 avril 2007 à 11:28
1) pourrais tu supprimer l'utilisation des constantes dans tes fonctions afin de rendre ton code plus facilement exploitable ;)
2) fait des tests ou transtypage des parametres passés a tes fonctions, ca permettrai d'éviter des erreurs si on passe des parametres erronés.
9 avril 2007 à 02:25
Par contre, j'ai supprimé $use_range, mais ça marche pas, il reste le salaud xD
8 avril 2007 à 21:48
# {
# $from = (int) $from;
# $to = (int) $to;
# if ($use_range) $n = mt_rand( $from, $to);
# else $n = mt_rand();
#
# return $n;
# }
function get_random_integer( $from, $to, $use_range = true) {
return $use_range ? mt_rand( (int) $from, (int) $to ) : mt_rand();
}
# function get_random_integer_mode( $exclusive, $array, $from, $to)
# {
# do
# {
# $n = get_random_integer( TRUE, $from, $to);
# }
# while ( (in_array( $n, $array)) && ($exclusive));
#
# return $n;
# }
=>
function get_random_integer_mode(&$array, $from, $to, $exclusive=true) {
do {
$n = get_random_integer($from, $to);
} while ( $exclusive && in_array( $n, $array) );
$array[] = $n;
}
# while (!isset( $songs_list[ $nb_keys]))
# $songs_list[] = get_random_integer_mode( TRUE, $songs_list, 1, $nb_songs);
=>
for ($i=0; $i<$nb_keys; $i++)
get_random_integer_mode(&$array, 1, $nb_songs);
Au mieux :)
Mais je comprend pas trop ce code...
Si je veux faire une playlist en random, je fais plutot :
<?php
//Init
$array = array();
$max_songs = 10;
// Remplissage du tableau
for ($i=0; $i<$max_songs; $i++)
$array[$i] = $i+1;
// Mélange du tableau
shuffle($array);
// Affichage
foreach($array as $key=>$val)
echo $key.' => '.$val.'
';
Et pis c'est tout :)
7 avril 2007 à 17:47
Je viens de rectifier ça ^^
7 avril 2007 à 11:01
en gros
si ( $from >= 0 && $to >=0 && $from!=$to )
generer_aleatoire($from, $to)
sinon
generer_aletoire();
ca ne sert a rien de renseigner use_range a false et from/to en meme temps
7 avril 2007 à 02:16
J'ai remplacé l'ancienne par celle-là dans la source.
7 avril 2007 à 02:05
Si je mettais ça ?
do
{
$n = get_random_integer( TRUE, $from, $to);
}
while ( (in_array( $n, $array)) && ($exclusive));
7 avril 2007 à 02:01
Par contre, je ne comprends pas la condition de ta boucle :
1. $exclusive ne change jamais donc renvoie tjs la même valeur !
2. c'est le temps que $n EST dans le tableau qu'il faut itérer, donc j'aurais pas mis le " ! "...
Moi j'aurai plutôt fait :
if ($exclusive)
do
{
$n = get_random_integer( TRUE, $from, $to);
}
while ( in_array( $n, $array));
else $n = get_random_integer( TRUE, $from, $to);
Mais là, on retombe sur deux appels à get_random_integer...
7 avril 2007 à 01:05
Concernant le transtypage, c'est bien ca, cependant je vois pas l'interet de ta variable $use_range, tu le sais si $from et $to sont des entiers numeriques positifs différents
# function get_random_integer_mode( $exclusive, $array, $from, $to)
# {
# $n = get_random_integer( TRUE, $from, $to);
# if ($exclusive)
# while (in_array( $n, $array))
# $n = get_random_integer( TRUE, $from, $to);
#
# return $n;
# }
je l'écrirai plus avec un do..while, ca m'evites d'ecrire 2 fois get_random_integer ;)
do{
$n = get_random_integer( TRUE, $from, $to);
}while( (!in_array($n, $array)&&$exclusif) || !$exclusif );
6 avril 2007 à 18:57
Pour le transtypage, c'est bien ça ?
@+
6 avril 2007 à 11:28
2) fait des tests ou transtypage des parametres passés a tes fonctions, ca permettrai d'éviter des erreurs si on passe des parametres erronés.