Fonction random

Fermé
AleuiA - 22 nov. 2009 à 23:02
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 24 nov. 2009 à 23:35
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 !

4 réponses

nobie-cs Messages postés 155 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010 16
22 nov. 2009 à 23: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 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 658
23 nov. 2009 à 01:36
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 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
23 nov. 2009 à 06:25
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
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 samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010 16
22 nov. 2009 à 23:30
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
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 samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010 16
22 nov. 2009 à 23:35
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 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
23 nov. 2009 à 06:28
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
ok Merci pour l'info; je repasserai surement sur le forum : Bubble en cours de cour de programmation ! ^^
0
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 658
24 nov. 2009 à 23:35
héhé Bubble... Ce sera je pense ton premier exemple de très très mauvais algorithme, à ne jamais utiliser en pratique :)
0