TABLEAU DE NOMBRES ENTIERS ALÉATOIRES, TOUS DIFFÉRENTS OU NON, COMPRIS OU NON DA

cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009 - 6 avril 2007 à 11:28
BreakingCentral Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/42101-tableau-de-nombres-entiers-aleatoires-tous-differents-ou-non-compris-ou-non-dans-un-intervalle

BreakingCentral Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 9 avril 2007
9 avril 2007 à 02:25
Aussi :)

Par contre, j'ai supprimé $use_range, mais ça marche pas, il reste le salaud xD
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 avril 2007 à 21:48
# function get_random_integer( $user_range, $from, $to)
# {
# $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 :)
BreakingCentral Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 9 avril 2007
7 avril 2007 à 17:47
C'est pas faux :D
Je viens de rectifier ça ^^
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 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és 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Derniè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és 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Derniè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és 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Derniè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és 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 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

# 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 );
BreakingCentral Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Derniè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és 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 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.
Rejoignez-nous