begin process at 2010 09 02 22:24:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

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

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


 Information sur la source

Note :
Aucune note
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 :13 744

Auteur : BreakingCentral

Ecrire un message privé
Site perso
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().

 Sources du même auteur

Source avec Zip [ CLASSE ] GÉNÉRER LA STRUCTURE D'UNE PAGE WEB À L'AIDE D'UN...

 Sources de la même categorie

MULTIPLIEZ LES TIMERS SUR VOS SCRIPTS PHP ET BENCHEZ FACILEM... par MonkeyIsBack
Source avec Zip Source avec une capture AFFICHER UNE IMAGE SANS IMAGE (GRÂCE AUX URI) par Astalavista
Source avec Zip EXÉCUTER UN SCRIPT PHP EN TANT QUE SERVICE WINDOW par ig3
Source avec Zip Source avec une capture LOGGER LE TEMPS D'EXÉCUTION DE VOS FONCTIONS PHP par djroulo
LA DIFFÉRENCE ENTRE DEUX DATE EN PLUSIEURS FORMATS par nasro81

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GÉNÉRATION DE FORMULAIRES HTML PERSONNALISÉS. par beejeridou
Source avec Zip GÉNÉRER UN MOT DE PASS ALÉATOIRE par narkos2
Source avec Zip DÉBUTANT : FONCTION POUR TRANSFORMER UN TEMPS EN SECONDES EN... par MonkeyIsBack
Source avec Zip Source avec une capture CITATION ALÉATOIRE AU CHARGEMENT D'UNE PAGE WEB par rocky87
Source avec Zip FONCTION QUI GÉNÉRE UN MOT DE PASSE ALÉATOIRE par italiasky

Commentaires et avis

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.

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 ?

@+

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


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

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

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.

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

Commentaire de BreakingCentral le 07/04/2007 17:47:37

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

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

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

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales