Fonction random

AleuiA -  
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

après plusieurs recherche sur le sujet, j'en suis arrivé a un petit problème:

j'ai bien une fonction random qui fonctionne:


int l;
int min=0;
int max=3;
srand(time(NULL));
l = (min + ((float) rand() / RAND_MAX * (max - min + 1)));

cependant, si je la met dans une boucle for:

int l;
int min=0;
int max=3;
int i;
for(i=0;i<10;i++)
{
srand(time(NULL));
l = (min + ((float) rand() / RAND_MAX * (max - min + 1)));
}

les 10 randoms qu'elle me sortira seront identiques
d'après mes infos, ce serait parce tout les randoms se font en même temps
du coup et il possible de modifier le srand(time(NULL)) a chaque passage dans la boucle ? si oui comment ?

Merci d'avance !
A voir également:

4 réponses

nobie-cs Messages postés 155 Date d'inscription   Statut Membre Dernière intervention   17
 
pour le random il faut utiliser % pas / voici un exemple

#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[])
{
int l;

srand (time (NULL));
l=(rand()%5);

printf("%d",l);

getchar();
return 0;
}

}
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
mais non ! il faut bien diviser par RAND_MAX pour avoir un nombre entre 0 et RAND_MAX . faire modulo marche... pour autant que tu fais modulo un nombre plus petit que RAND_MAX, ce qui n'est pas garanti.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Pour le random il faut utiliser % pas / voici un exemple
C'est le contraire. Le modulo fonctionne mais ne respecte pas l'équiprobabilité puisque se bas sur les bits faibles.
0
AleuiA
 
oui j'ai aussi essayé cette fonction qui marche mais le probleme reste le meme:


int i,l;
int main()
{
for(i=0;i<10;i++)
{
srand(time(NULL));
l = rand()%2;
printf("%d",alea);
}
}

les 10 random sont identiques ...
0
nobie-cs Messages postés 155 Date d'inscription   Statut Membre Dernière intervention   17
 
tu doit faire srand(time(NULL)); on dort de la boucle je sait pas vraiment pourquoi :(

#include <stdio.h>
#include <time.h>

srand(time(NULL));
for(i=0;i<10;i++)
{
l = rand()%2;
printf("%d",l);
}
0
AleuiA
 
a oui effectivement ....
je demanderait a mes profs pourquoi .... interressant ... merci de t'être posé la question et d'avoir résolu mon problème !
0
nobie-cs Messages postés 155 Date d'inscription   Statut Membre Dernière intervention   17
 
sa te dérange si tu poste la réponse des prof :) sa sera sympa en plus peut tu change le statut du poste
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
La réponse est très simple.
srand() est un générateur de nombres pseudo-aléatoires. On met le seed en argument et on obtiendra via rand les différents nombres du générateur qui respecte l'équiprobabilité entre 0 et RAND_MAX. Si tu refais à chaque boucle srand, tu utiliseras un autre générateur ce qui ne te donnera aucune garantie. De plus la boucle est tellement rapide que time(NULL) te donnera la même valeur et donc la graine n'aura pas changé.
Il faut retenir qu'on initialise qu'une et une seule fois le générateur.

Cdlt
0
AleluiA
 
ok Merci pour l'info; je repasserai surement sur le forum : Bubble en cours de cour de programmation ! ^^
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
héhé Bubble... Ce sera je pense ton premier exemple de très très mauvais algorithme, à ne jamais utiliser en pratique :)
0