Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TABLEAU DE NOMBRES ENTIERS ALÉATOIRES, TOUS DIFFÉRENTS OU NON, COMPRIS OU NON DANS UN INTERVALLE


Information sur la source

Catégorie :Astuces Classé sous : aléatoire, nombre, aléatoires, nombres, générer Niveau : Débutant Date de création : 06/04/2007 Date de mise à jour : 07/04/2007 02:14:19 Vu : 8 626

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

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

  • <?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";
  • ?>
<?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
 

Historique

06 avril 2007 07:41:52 :
ROFL ! Complètement oublié les balises <?php ?> :D
06 avril 2007 07:46:53 :
Repagination du code pour le site
06 avril 2007 18:55:36 :
1. Remplacement des constantes par des variables. 2. Transtypage.
07 avril 2007 02:12:13 :
Modification du corps de la fonction get_random_integer_mode (un seul appel a la fonction get_random_integer).
07 avril 2007 02:14:19 :
Modification des commentaires
07 avril 2007 17:45:03 :
Suppression de la variable booléenne $use_range dans la fonction get_random_integer().

Commentaires et avis

signaler à un administrateur
Commentaire de garfield90 le 06/04/2007 11:28:19

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.

signaler à un administrateur
Commentaire de BreakingCentral le 06/04/2007 18:57:49

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 ?

@+

signaler à un administrateur
Commentaire de garfield90 le 07/04/2007 01:05:47

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 );


signaler à un administrateur
Commentaire de BreakingCentral le 07/04/2007 02:01:23

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

signaler à un administrateur
Commentaire de BreakingCentral le 07/04/2007 02:05:16

Ah j'ai peut-être trouvé !
Si je mettais ça ?

do
{
  $n = get_random_integer( TRUE, $from, $to);
}
while ( (in_array( $n, $array)) && ($exclusive));

signaler à un administrateur
Commentaire de BreakingCentral le 07/04/2007 02:16:25

J'ai testé cette nouvelle version et ça marche.
J'ai remplacé l'ancienne par celle-là dans la source.

signaler à un administrateur
Commentaire de garfield90 le 07/04/2007 11:01:29

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

signaler à un administrateur
Commentaire de BreakingCentral le 07/04/2007 17:47:37

C'est pas faux :D
Je viens de rectifier ça ^^

signaler à un administrateur
Commentaire de FhX le 08/04/2007 21:48:35

# 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.'<br/>';

Et pis c'est tout :)
  

signaler à un administrateur
Commentaire de BreakingCentral le 09/04/2007 02:25:59

Aussi :)

Par contre, j'ai supprimé $use_range, mais ça marche pas, il reste le salaud xD

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Générer un nombre aléatoire [ par Mikonyx ] slt,pour générer un nombre aléatoire, j'utilise la commande:srand(time());$url=rand(1,$x);echo $url; $x ayant été déjà défini avant...Ca fonctionne, m générer un nombre aléatoire entre 1 et 16 [ par aze555666 ] bonjour. quelle est la fonction php pour g&#233;n&#233;rer un nombre entier al&#233;atoire entre 1 et 16??? le but est ensuite de r&#233;cup&#233;rer Nombre aléatoire [ par thekid23 ] Salut comment faire un nombre aléatoire ? recherche un bon programmeur [ par xavier230573 ] bonjour , voila je recherche un codeur , un bon codeur pour ajouter du code à un script existant .script (aardvarktopsites 5.1.2 ) site http://www.aar MySQL et Valeur Decimal [ par sebalex ] Bonjour à tous,Je souhaite pouvoir trier des colonnes contenant des nombres. Pour ce faire, j'ai modifié la valeur du champ de ma bdd en "decimal". Do problème algo [ par didine6 ] Bonjour, J'ai un problème algo.Je fait une requête et je compte le nombre de résultat.Je souhaite placer tous les résultats dans un tableau html de 4 Nombre Aléatoir RAND [ par m2rtech ] Bonjour, Je voudrais generer un nombre aléatoir à 6 chiffres avec rand();<font color= générer un caddie [ par olivier59263 ] BonjourN'étant un pro de la programmation, j'aimerais avoir un peu d'aide pour générer un caddie.Comment fait-on "simplement" pour ajouter un produit compter le nombre de sous chaine dans une chaine [ par loupile ] Bonjour, alors voila j'ai une chaien $tag='http://www.monsite.com/test.php?url=http://www.monsite2.com/'  comment puis je connaitre le nombre de sous compter le nombre de noeuds dans un xml [ par loupile ] Bonjour, voila dans un xml il y a des balises &lt;item&gt; &lt;/item&gt; savez vous comment je peux faire pour compter le nombre d'item present dans u


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.