Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2870 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°573597
greeeg
Posté le 23-11-2003 à 01:26:18  profilanswer
 

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

mood
Publicité
Posté le 23-11-2003 à 01:26:18  profilanswer
 

n°573599
chrisbk
-
Posté le 23-11-2003 à 01:27:59  profilanswer
 

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

n°573604
Taz
bisounours-codeur
Posté le 23-11-2003 à 01:31:12  profilanswer
 

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

n°573605
chrisbk
-
Posté le 23-11-2003 à 01:31:50  profilanswer
 

koissa ":o" ?

n°573606
Taz
bisounours-codeur
Posté le 23-11-2003 à 01:33:22  profilanswer
 

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

n°573607
chrisbk
-
Posté le 23-11-2003 à 01:35:26  profilanswer
 

bon stu veux :o

n°573609
Taz
bisounours-codeur
Posté le 23-11-2003 à 01:36:31  profilanswer
 

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

n°573618
greeeg
Posté le 23-11-2003 à 01:48:30  profilanswer
 

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

n°573708
Kristoph
Posté le 23-11-2003 à 11:01:13  profilanswer
 

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 ?

n°573710
Taz
bisounours-codeur
Posté le 23-11-2003 à 11:04:55  profilanswer
 

non

mood
Publicité
Posté le 23-11-2003 à 11:04:55  profilanswer
 

n°573715
Kristoph
Posté le 23-11-2003 à 11:13:34  profilanswer
 


 
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.

n°573718
Taz
bisounours-codeur
Posté le 23-11-2003 à 11:15:22  profilanswer
 

tout à fait

n°573874
greeeg
Posté le 23-11-2003 à 14:58:29  profilanswer
 

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

n°573877
Taz
bisounours-codeur
Posté le 23-11-2003 à 15:02:16  profilanswer
 

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

n°573880
greeeg
Posté le 23-11-2003 à 15:08:00  profilanswer
 

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:

n°573881
Taz
bisounours-codeur
Posté le 23-11-2003 à 15:09:18  profilanswer
 

voire mon premier message

n°573885
greeeg
Posté le 23-11-2003 à 15:14:14  profilanswer
 

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

n°573886
Taz
bisounours-codeur
Posté le 23-11-2003 à 15:14:46  profilanswer
 

Taz a écrit :

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

faut te le dire comment ?

n°573887
chrisbk
-
Posté le 23-11-2003 à 15:15:57  profilanswer
 

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 §§§§!

n°573888
greeeg
Posté le 23-11-2003 à 15:19:28  profilanswer
 

MERCI !!!! :hello:

n°573898
nraynaud
lol
Posté le 23-11-2003 à 15:35:57  profilanswer
 

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
n°573901
Taz
bisounours-codeur
Posté le 23-11-2003 à 15:42:12  profilanswer
 

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

n°573916
blazkowicz
Posté le 23-11-2003 à 16:21:09  profilanswer
 

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
n°780872
Giz
Posté le 28-06-2004 à 18:49:15  profilanswer
 

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

n°780876
R3g
fonctionnaire certifié ITIL
Posté le 28-06-2004 à 18:58:33  profilanswer
 

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.
n°780878
Giz
Posté le 28-06-2004 à 19:03:52  profilanswer
 

R3g a écrit :

(1. / rand()) ?


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

n°780902
Giz
Posté le 28-06-2004 à 19:36:30  profilanswer
 

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

n°781051
matafan
Posté le 29-06-2004 à 02:31:11  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Afficher le nombre de connectés sur un siteQuestion sur les nombre aléatoires...
afficher le nombre de requete et le temp de chargementChoisir élément aléatoire?
[XML] Générer un graphe à partir de données XML ?[Delphi] tirage aléatoire suivant une loi normale ?
[C/C++] passer d'un int a 4 char (representant le nombre)[C/C++] Générer un nombre aléatoire
[ JS ] générer un nombre aléatoire et probleme de tableau ( var )[PHP] générer un nombre aléatoire...
Plus de sujets relatifs à : Générer un nombre aléatoire...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR