Pb génération nb Aléatoires en C - C - Programmation
Marsh Posté le 31-12-2004 à 13:14:33
ReplyMarsh 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.
Marsh Posté le 31-12-2004 à 13:58:19
Il faut surtout penser à changer la graine d'initialisation à chaque utilisation...
Marsh Posté le 31-12-2004 à 14:24:06
Lam's a écrit : Elles le sont, et en plus, elles marchent mal sous cygwin... |
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 ??
Marsh Posté le 31-12-2004 à 15:58:57
Essaye :
Code :
|
mais comme dit Lam's, tu devrais chercher qqc de plus
aleatoire (et avec une plage plus grande).
Marsh Posté le 01-01-2005 à 16:54:44
hoty a écrit : Essaye :
|
Marsh Posté le 01-01-2005 à 16:56:14
hoty a écrit : Essaye :
|
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() ???
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.
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
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 ?
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.
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.
Marsh Posté le 03-01-2005 à 06:17:39
thermocline a écrit : |
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 .
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