Pb génération nb Aléatoires en C

Pb génération nb Aléatoires en C - C - Programmation

Marsh Posté le 31-12-2004 à 12:24:07    

salut !!
je voudrai générer un nb aléatoire entre [0;1[ en utilisant drand48()..Je compile sous cygwin (gcc). A chaque fois j'obtient le meme nb : 0.000000
Qqun peut m'expliquer pkoi et comment bien généré mes nb ??
 
merci

Reply

Marsh Posté le 31-12-2004 à 12:24:07   

Reply

Marsh Posté le 31-12-2004 à 13:14:33    

elles sont pas dépréciées les fonctions qqchrand48 ?


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 31-12-2004 à 13:20:20    

Elles le sont, et en plus, elles marchent mal sous cygwin...
 
Il faut utiliser un bon rand() des familles, ou un générateur plus aléatoire.

Reply

Marsh Posté le 31-12-2004 à 13:58:19    

Il faut surtout penser à changer la graine d'initialisation à chaque utilisation...

Reply

Marsh Posté le 31-12-2004 à 14:24:06    

Lam's a écrit :

Elles le sont, et en plus, elles marchent mal sous cygwin...
 
Il faut utiliser un bon rand() des familles, ou un générateur plus aléatoire.


 
J'ai essayé rand(), mais j'obtient uniquement des entiers.. j'ai essayé de bidouiller comme ca:
 
     float alea;
     srand((float)time(NULL));  
     alea=(float)rand();
     alea=(alea%1);  
mais ca marche pas ...  
Sinon qd je compile a la FAC (sous unix) ca marche bien drand48() .. et d'apres ce ke j'ai lu drand48 est un tres bon générateur aléatoire...
De plus je connais qqun chez ki drand48 marche bien sous cygwin.. peut etre faut il ke je mette un nouveau stdlib.c et .h ds mon cygwin(une version ki gere bien le drand48) ??? ..
 
D'autre idées ??

Reply

Marsh Posté le 31-12-2004 à 15:58:57    

Essaye :
 

Code :
  1. float alea;
  2. srand ( time(NULL) );
  3. alea = ((float)rand()) / RAND_MAX;


 
mais comme dit Lam's, tu devrais chercher qqc de plus
aleatoire (et avec une plage plus grande).


---------------
http://www.ikimegon.com/
Reply

Marsh Posté le 31-12-2004 à 16:10:50    

attention, il y a une faute dans ton pseudo !

Reply

Marsh Posté le 01-01-2005 à 16:54:44    

hoty a écrit :

Essaye :
 

Code :
  1. float alea;
  2. srand ( time(NULL) );
  3. alea = ((float)rand()) / RAND_MAX;


 
mais comme dit Lam's, tu devrais chercher qqc de plus
aleatoire (et avec une plage plus grande).


Reply

Marsh Posté le 01-01-2005 à 16:56:14    

hoty a écrit :

Essaye :
 

Code :
  1. float alea;
  2. srand ( time(NULL) );
  3. alea = ((float)rand()) / RAND_MAX;


 
mais comme dit Lam's, tu devrais chercher qqc de plus
aleatoire (et avec une plage plus grande).


 
oupssss erreur de manip..Bonne année !!!
 
Merci .. ton code fonctionne .. mais qu'est ce que tu entends par une "plage plus gde" ?? et comment trouver qq chose de plus aléatoire que rand() ???
 

Reply

Marsh Posté le 01-01-2005 à 18:58:59    

Reply

Marsh Posté le 01-01-2005 à 18:58:59   

Reply

Marsh Posté le 02-01-2005 à 07:26:53    

El touristo a écrit :

Merci .. ton code fonctionne .. mais qu'est ce que tu entends par une "plage plus gde" ?? et comment trouver qq chose de plus aléatoire que rand() ???


 
RAND_MAX vaut en general 32767. Sur ton intervalle 0,1 ca fait des pas de 30.5E-6. Meme avec le code de Taz tu ne peux avoir que 32767 valeurs differentes.
 
Regarde ici : http://www.math.sci.hiroshima-u.ac [...] 937ar.html
 
En utilisant genrand_res53 tu va avoir un pas de 1.1E-16. De plus ce generateur a une periode de 2^19937-1. Au mieux, rand doit avoir une periode de 2^32.


---------------
http://www.ikimegon.com/
Reply

Marsh Posté le 02-01-2005 à 10:51:07    

le problème ce n'est pas le code, c'est de savoir si on veut être portable

Reply

Marsh Posté le 02-01-2005 à 15:00:00    

a ce sujet, est-ce envisageable d'utiliser plusieurs fois rand() pour générer un seul nombre aléatoire "plus aléatoire ?" en utilisant rand() * rand() ou ((double)rand())/((double)rand()) par exemple ?
 


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-01-2005 à 15:50:38    

non, vu que x(i+1) est fonction de x(i)

Reply

Marsh Posté le 02-01-2005 à 15:51:30    

BlackGoddess a écrit :

a ce sujet, est-ce envisageable d'utiliser plusieurs fois rand() pour générer un seul nombre aléatoire "plus aléatoire ?" en utilisant rand() * rand() ou ((double)rand())/((double)rand()) par exemple ?


 
On va peut etre diviser la taille du pas par deux, mais a priori ca devrait aussi diviser la periode par deux (vu qu'on fait deux tirages a chaque fois).
 
Quand a la portabilite, c'est une question de choix et de point de vue : moi je mettrais le source de mt19937 dans le projet.

Reply

Marsh Posté le 02-01-2005 à 15:55:29    

ca veut dire quoi plus aleatoire?
Ca sent la complication pour rien du tout a plein nez (ex: rand * rand peut valoir 2e31 * 2e31...)
Il y a des algos qui marchent tres bien, qui sont portables et surs (Mersenne Twister ici present en est un tres bon exemple)
 
Et au moins on sait ce qui se passe.

Reply

Marsh Posté le 03-01-2005 à 06:17:39    

thermocline a écrit :


Et au moins on sait ce qui se passe.


Exactement, et c'est pas très cool pour un algo de tirage aléatoire.  
 
Si la Française des jeux décide d'informatiser son tintouin et d'utiliser un pauvre Rand() pour tirer les nombres du Loto, tu peux être sûr que dès le lendemain, il y a une bonne centaine d'informaticiens millionnaires.
 
Bref, pour avoir des choses un peu plus aléatoires, il y a /dev/random (avec EGD si besoin est: http://egd.sourceforge.net/).  
Pour des petits tirages, j'ai tendance à foutre plusieurs nombres aléatoires dans un tableau puis à faire un shuffle. Ca marche aussi :).
 

Reply

Sujets relatifs:

Leave a Replay

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