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

Messages postés
389
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009
- - Dernière réponse : 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
-
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 -
# 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
-
C'est pas faux :D
Je viens de rectifier ça ^^
cs_garfield90
Messages postés
389
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009
-
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
-
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
-
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
-
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
389
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009
-
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
-
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
389
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009
-
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.