Générer un nombre aléatoire...

Générer un nombre aléatoire... - C - Programmation

Marsh Posté le 23-11-2003 à 01:26:18    

Bonsoir,  
 
j'ai juste un petit problème avec la fonction qui permet de choisir un nombre aléatoirement.
 
En effet si je fais
 
int_variable = rand();
 
Il me sort une valeur au bol, mais j'aimerais pouvoir lui donner les 2 bornes : choisir un nombre, au bol, entre 0 et 7 p.ex.
 
De plus, il me sort toujours la même valeur (41) même si je recompile tout le fichier....  :heink: pourquoi ?
 
1000 Mercis

Reply

Marsh Posté le 23-11-2003 à 01:26:18   

Reply

Marsh Posté le 23-11-2003 à 01:27:59    

1/ rand()%(taLimiteMax)
2/ parce que c'est du pseudo aleatoire. initialise avec srand et le tps courant

Reply

Marsh Posté le 23-11-2003 à 01:31:12    

chrisbk > :o  
 
putain, je croyais que tout ça été compris maintemant  
 
http://www.isty-info.uvsq.fr/~rume [...] 4.html#q_9
 
en début de programme  
 
srand(time(NULL));
 

Reply

Marsh Posté le 23-11-2003 à 01:31:50    

koissa ":o" ?

Reply

Marsh Posté le 23-11-2003 à 01:33:22    

il ne faut jamais utiliser rand() avec un simple modulo, parce que ça revient quasiment à ne prendre en compte que les bits de poids faibles, donc déjà que rand() est pas terrible, là c'est un massacre

Reply

Marsh Posté le 23-11-2003 à 01:35:26    

bon stu veux :o

Reply

Marsh Posté le 23-11-2003 à 01:36:31    

fut un temps ou j'avais un dans ma signature une source .c démontrant la meilleure qualité de cette méthode et comment générer proprement des nombres aléatoires avec ça

Reply

Marsh Posté le 23-11-2003 à 01:48:30    

Taz a écrit :

chrisbk > :o  
 
putain, je croyais que tout ça été compris maintemant  
 
http://www.isty-info.uvsq.fr/~rume [...] 4.html#q_9
 
en début de programme  
 
srand(time(NULL));
 
 


 
super ce lien... plein de choses utiles

Reply

Marsh Posté le 23-11-2003 à 11:01:13    

Taz a écrit :

il ne faut jamais utiliser rand() avec un simple modulo, parce que ça revient quasiment à ne prendre en compte que les bits de poids faibles, donc déjà que rand() est pas terrible, là c'est un massacre


 
Enfin quand même, c'était vrai il y a des années ça mais maintenant, les libc se sont mise à jour avec de meilleurs generateurs aléatoires non ?

Reply

Marsh Posté le 23-11-2003 à 11:04:55    

non

Reply

Marsh Posté le 23-11-2003 à 11:04:55   

Reply

Marsh Posté le 23-11-2003 à 11:13:34    


 
En tout cas, quand je fais "man 3 rand" ils disent que c'est bon avec ma libc :D
 
Sinon, il reste toujours la solution assez simple qui consiste à remplacer le generateur aléatoire par un autre vraiment performant.

Reply

Marsh Posté le 23-11-2003 à 11:15:22    

tout à fait

Reply

Marsh Posté le 23-11-2003 à 14:58:29    

ok ... mais j'ai le problème suivant : il me sort que le même nombre :
 

Code :
  1. int main()
  2. {
  3.     int i;
  4.     for(i=0; i<=10; i++)
  5.     {
  6.    
  7.     srand(time(NULL));
  8.     int aleatoire;
  9.     int N=10;
  10.     aleatoire = (int)((double)rand() / ((double)RAND_MAX + 1) * N);
  11.     printf("Un nombre aléatoire, %d\n", aleatoire); 
  12.    
  13.     }
  14.     system("PAUSE" );
  15.     return 0;
  16. }


 
Résultat :
 

Code :
  1. Un nombre alÚatoire, 3
  2. Un nombre alÚatoire, 3
  3. Un nombre alÚatoire, 3
  4. Un nombre alÚatoire, 3
  5. Un nombre alÚatoire, 3
  6. Un nombre alÚatoire, 3
  7. Un nombre alÚatoire, 3
  8. Un nombre alÚatoire, 3
  9. Un nombre alÚatoire, 3
  10. Un nombre alÚatoire, 3
  11. Un nombre alÚatoire, 3

Reply

Marsh Posté le 23-11-2003 à 15:02:16    

ben tu réinitialises à chaque fois donc tu obtiens la meme séquence. comme time renvoie un nombre de seconde et que la boucle est rapide, tu as exactement la même chose
 
voir mon premier message

Reply

Marsh Posté le 23-11-2003 à 15:08:00    

Taz a écrit :

ben tu réinitialises à chaque fois donc tu obtiens la meme séquence. comme time renvoie un nombre de seconde et que la boucle est rapide, tu as exactement la même chose
 
voir mon premier message


 
j'ai fait une boucle pour i =0 juska 10000000. L'execution dure 10s... et il me sort : 6 6 6 6 6 6 6 6 ....  :heink:

Reply

Marsh Posté le 23-11-2003 à 15:09:18    

voire mon premier message

Reply

Marsh Posté le 23-11-2003 à 15:14:14    

excuse moi, mais je comprends pas.
En java c'est bien moins compliqué.  ;)
 
Comment je dois faire alors. J'ai bien lu ton lien... mais .....
 
:(

Reply

Marsh Posté le 23-11-2003 à 15:14:46    

Taz a écrit :

en début de programme  
 
srand(time(NULL));

faut te le dire comment ?

Reply

Marsh Posté le 23-11-2003 à 15:15:57    

Taz a écrit :

faut te le dire comment ?


 
comme ca :
 
TU NOUS FOUS CE FOUTU PUTAIN DE SRAND JUSTE UNE SEULE PUTAIN DE FOIS EN DEBUT DE PROGRAMME ET APRES T'Y TOUCHES PU ET ON EN PARLE PU §§§§!

Reply

Marsh Posté le 23-11-2003 à 15:19:28    

MERCI !!!! :hello:

Reply

Marsh Posté le 23-11-2003 à 15:35:57    

oulà, prendre très peu de nombres sur un généréteur, c'est casse-gueule, voir http://www-cs-faculty.stanford.edu [...] 2.html#rng pour la précision.
algo corrigé :
http://www-cs-faculty.stanford.edu [...] rams/rng.c


Message édité par nraynaud le 23-11-2003 à 15:36:36

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 23-11-2003 à 15:42:12    

Code :
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <ctime>
  5. using namespace std;
  6. unsigned mod(unsigned i, unsigned N)
  7. {
  8.   return i % N;
  9. }
  10. unsigned mult(unsigned i, unsigned N)
  11. {
  12.   static const double A= sqrt(5.0) - 1.0;
  13.   double ipart, fpart;
  14.   fpart= modf(i * A, &ipart);
  15.   return unsigned(N * fpart);
  16. }
  17. int main()
  18. {
  19.   unsigned N;
  20.   cin >> N;
  21.   cout << (N/2.0) << endl;
  22.   srand(time(0));
  23.   double m1=0, m2=0;
  24.   for(int i=0; i<100000; ++i)
  25.     {
  26.       unsigned a= rand();
  27.       m1+=mod(a, N);
  28.       m2+=mult(a, N);
  29.     }
  30.   cout << (m1/100000) << '\t' << (m2/100000) << endl;
  31. }


 
j'aime bien cette fonction (ici appelé mult), elle a une bonne réparition, c'est bien de l'utiliser dans un table de hashage, elle permet de contourner le problème du modulo

Reply

Marsh Posté le 23-11-2003 à 16:21:09    

greeeg a écrit :

Bonsoir,  
 
j'ai juste un petit problème avec la fonction qui permet de choisir un nombre aléatoirement.
 
En effet si je fais
 
int_variable = rand();
 
Il me sort une valeur au bol, mais j'aimerais pouvoir lui donner les 2 bornes : choisir un nombre, au bol, entre 0 et 7 p.ex.
 
De plus, il me sort toujours la même valeur (41) même si je recompile tout le fichier....  :heink: pourquoi ?
 
1000 Mercis


 


 
10 RANDOMIZE TIMER
20 x=int(rnd(1)*8)
30 print "Un nombre aléatoire : ";x
35 for i=1 to 4000 : next : REM c'est pour avoir le temps de lire
40 goto 20
 


 
:D


Message édité par blazkowicz le 23-11-2003 à 16:22:34
Reply

Marsh Posté le 28-06-2004 à 18:49:15    

euh, question conne : la fonction standard C rand () et random ()
renvoient un int.
 
Et si je veux un nombre compris entre 0 et 1 ([0,1[) comme en Java, c koi cette fonction qui fais ca en C ? :??:

Reply

Marsh Posté le 28-06-2004 à 18:58:33    

Giz a écrit :

euh, question conne : la fonction standard C rand () et random ()
renvoient un int.
 
Et si je veux un nombre compris entre 0 et 1 ([0,1[) comme en Java, c koi cette fonction qui fais ca en C ? :??:

(1. / rand()) ?


Message édité par R3g le 28-06-2004 à 18:58:45

---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 28-06-2004 à 19:03:52    

R3g a écrit :

(1. / rand()) ?


hum...ca n'a pas l'air trop bete ca :D, c'est la methode generalement utilisee ?

Reply

Marsh Posté le 28-06-2004 à 19:36:30    

R3g a écrit :

(1. / rand()) ?


 
hum... :non: spa bien finalement : cela revient a appliquer une fonction 1/x => la repartition des valeurs n'est pas lineaire  :o  
 
Autre solution  :??:

Reply

Marsh Posté le 29-06-2004 à 02:31:11    

Ben si tu veux du linéaire, rand() / RAND_MAX... C'est en cinquième qu'on fait les fonctions affines, non ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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