Function de tirage aleatoire [ RÉSOLU ! ]

Function de tirage aleatoire [ RÉSOLU ! ] - PHP - Programmation

Marsh Posté le 22-08-2002 à 12:21:57    

Bonjour, voila j'ai créé une fonction qui génere un nom de fichier aleatoire. La fonction marche, mais le probleme c'est que si je l'utilise 2 fois a la suite dans un meme script, elle va me tirer exactement la meme chose, et je capte pas pourquoi !!! voici ma fonction :  
 

Code :
  1. function random_name($nom_recu, $taille_nom)
  2. {
  3. if($taille_nom>32) $taille_nom=32;
  4. $tab_char="abcdefghijklmnopqrstuvwxyz1234567890___";
  5. srand(time());
  6. $nom_recu = explode(".",$nom_recu);
  7. while($i<$taille_nom)
  8.  {
  9.  $random_char .= $tab_char[rand(0,strlen($tab_char))];
  10.  $i++;
  11.  }
  12. $return_name=$random_char.".".$nom_recu[1];
  13. return $return_name;
  14. }


 
voila, pourtant j'ai mis srand(time()); au debut, qqun comprend ce qu'il se passe?? Parce que la...
 
EDIT: j'utilise 2 fois a la suite la fonction et ca me donne ca :
l1zehujsi25z_5sdxrh0.jpg
l1zehujsi25z_5sdxrh0.jpg
 
comprend po


Message édité par SquiiiD le 22-08-2002 à 13:59:25
Reply

Marsh Posté le 22-08-2002 à 12:21:57   

Reply

Marsh Posté le 22-08-2002 à 12:27:20    

j'ai testé mais ce n'est pas tout le temps qu'elle renvoie le meme nom de fichier !

Reply

Marsh Posté le 22-08-2002 à 12:29:17    

si tu rafraichis la page ca changera mais si dans mon script x.php je met
 

Code :
  1. <?
  2. $nom1="aaa.jpg";
  3. $nom2="bbb.jpg";
  4. echo random_name($nom1, 20);
  5. echo random_name($nom2, 20);
  6. ?>


 
bah ca tire 2 fois le meme ...  
 
si tu rafraichis ca sera un autre nom mais tjrs deux fois le meme :(
 
P.S.: j'ai essayé en mettant microtime a la place de time, et meme de reinitialisé la variable $random_char . mais ca change rien :(


Message édité par SquiiiD le 22-08-2002 à 12:39:29
Reply

Marsh Posté le 22-08-2002 à 13:20:28    

personne?

Reply

Marsh Posté le 22-08-2002 à 13:50:26    

time() te renvoie un nombre de secondes ; du coup, si tu executes 2 fois ta fonction dans la même seconde, le compteur de nombres aléatoires est initialisé avec la même valeur, et du coup les séquences générées seront toutes les mêmes.
 
Il faut plutôt utiliser un truc du genre :
 
srand(time().substr(microtime(), 2, 8));
 
Eventuellement même sans mettre le "time().".

Reply

Marsh Posté le 22-08-2002 à 13:53:33    

_Mac_ a écrit a écrit :

time() te renvoie un nombre de secondes ; du coup, si tu executes 2 fois ta fonction dans la même seconde, le compteur de nombres aléatoires est initialisé avec la même valeur, et du coup les séquences générées seront toutes les mêmes.
 
Il faut plutôt utiliser un truc du genre :
 
srand(time().substr(microtime(), 2, 8));
 
Eventuellement même sans mettre le "time().".




EXACT !

Reply

Marsh Posté le 22-08-2002 à 13:54:15    

salut mac j'ai essayé comme tu as dit et ca me sort a tout les coups :(
 
ttttttttt.jpg
ttttttttt.jpg
ttttttttt.jpg
ttttttttt.jpg
ttttttttt.jpg
 
 
y a plus rien d'aleatoire, tain c trop bizzare ce truc...  
 
merci kan meme


Message édité par SquiiiD le 22-08-2002 à 13:54:42
Reply

Marsh Posté le 22-08-2002 à 13:55:32    

srand() est fait pour initialiser le générateur, c'est donc à appeler une seule fois, et surtout pas dans une fonction.

Reply

Marsh Posté le 22-08-2002 à 13:56:59    

ha bon?

Reply

Marsh Posté le 22-08-2002 à 13:59:13    

Ben je viens de virer le srand() de ma fonction et je l'ai mis avant d'utiliser la fonction plusieur fois et la ca marche nickel !!! Bon bah je me coucherai moins con ce soir !
 
Merci youdontcare et les autres ;)


Message édité par SquiiiD le 22-08-2002 à 13:59:53
Reply

Marsh Posté le 22-08-2002 à 13:59:13   

Reply

Marsh Posté le 22-08-2002 à 14:00:57    

SquiiiD a écrit a écrit :

ha bon?


l'algo pour générer un nombre aléatoire marche itérativement. en gros,
 
nouveauNombre = ancienNombre * constante + autreConstante
 
au début de ton programme, ancienNombre a une valeur hardcodée. ça produit donc toujours les mêmes nombres.
 
srand() change cette valeur. comme le dit _mac_, si tu utilises le nombre de secondes, tu spécifies la même valeur initiale, qui donnent alors des nombres identiques.

Reply

Marsh Posté le 22-08-2002 à 14:03:32    

Oui ca j'avais compris mais je comprenais pas que ca me sorte tout le temps la meme suite alors que srand était activé ! Mais il était activé plusieur fois, et comme t'as dit qu'on peut l'activer qu'une fois j'ai testé et ca marche... mais je comprends quand meme pas pourquoi c'est impératif de l'activer une seule fois ...  
 
tkx

Reply

Marsh Posté le 22-08-2002 à 14:06:59    

SquiiiD a écrit a écrit :

mais je comprends quand meme pas pourquoi c'est impératif de l'activer une seule fois ...


ce n'est pas un état on / off. si tu donnes le temps en secondes courant, ça donne naissance à une certaine suite. si tu "l'actives" qq milli secondes + tard avec le même temsp en secondes, tu te retrouves avec la même suite (donc les mêmes nombres).
 

SquiiiD a écrit a écrit :

Oui ca j'avais compris mais je comprenais pas que ca me sorte tout le temps la meme suite


visiblement, non.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed