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

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

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.