Tableau de nombres entiers aléatoires, tous différents ou non, compris ou non dans un intervalle

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 123 fois - Téléchargée 19 fois

Contenu du snippet

Ce code génère un tableau de n nombres entiers aléatoires indicé de 0 à n - 1.
Vous pouvez choisir de générer tous les nombres entiers compris dans un intervalle, ou n'importe quels nombres entiers, n'importe quel nombre de fois.

L'intérêt de ce code est que vous pouvez choisir de générer des nombres entiers tous différents les uns des autres.
En effet, je n'ai rien trouvé sur PHPCS qui me permette de le faire.

Par exemple, si vous voulez générer la suite des nombres de 1 à 10, vous pourrez obtenir :

4,8,7,2,9,1,3,5,10,6 ;

mais aussi :

2,10,8,4,7,5,3,9,6,1.

Mais vous pouvez choisir de ne pas empêcher le même nombre de resortir plusieurs fois.

J'ai créé ce code pour mon site où je voulais que les titres de la playlist soient proposés aléatoirement au visiteur, ce qui explique le nom des variables :D

Source / Exemple :


<?php

//
// Auteur : Guillaume Sahut
// Site web : www.breakingcentral.com
//

// Fonction qui retourne un nombre entier aléatoire.
// Si $use_range vaut TRUE, la valeur renvoyée est
// comprise entre $from inclus et $to inclus.
// Si $use_range vaut FALSE, la valeur renvoyée est quelconque.
function get_random_integer( $use_range, $from, $to)
{
  $from = (int) $from;
  $to = (int) $to;
  if ($use_range) $n = mt_rand( $from, $to);
  else $n = mt_rand();

  return $n;
}

// Fonction qui renvoie un nombre entier aléatoire, en testant
// éventuellement sa présence dans le tableau.
// Si $exclusive vaut TRUE, la fonction renvoie un nombre entier aléatoire,
 // compris entre $from inclus et $to inclus, qui n'est pas déjà contenu
 // dans le tableau $array.
 // Si $exclusive vaut FALSE, la fonction renvoie un nombre entier aléatoire,
 // compris entre $from inclus et $to inclus.
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;
}

// On prépare le matos
$nb_songs = 3;              // nombre de chansons
$nb_keys = $nb_songs - 1;   // nombre de clés (de 0 à $nb_keys)
$songs_list = array();      // initialisation du tableau du résultat

// Tant que le tableau n'est pas complet, on le remplit.
while (!isset( $songs_list[ $nb_keys]))
  $songs_list[] = get_random_integer_mode( TRUE, $songs_list, 1, $nb_songs);

// On visualise le résultat de ce magnifique code
// et on dit merci à BreakingCentral.com ^^
echo '<table>'."\n".'<tr><th>Clé</th><th>Valeur</th></tr>'."\n";
while (list( $key, $value) = each( $songs_list))
  echo '<tr><td>'.$key.'</td><td>'.$value.'</td></tr>'."\n";
echo '</table>'."\n"; 

?>

Conclusion :


Théoriquement, il est probable que la fonction get_random_integer_mode(), avec $exclusive à TRUE, ne se termine jamais !
En effet, il n'est pas sûr à 100% que la valeur renvoyée par get_random_integer() ne soit pas dans le tableau, puisque c'est du (pseudo-) hasard... Mais bon, je l'ai testé plusieurs fois et on dirait que le hasard fait bien les choses ^^ :D

A voir également

Ajouter un commentaire

Commentaires

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
388
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.