|
|
|
|
B'jour les gens,
Bon, je crains que ça fasse noube de demander, d'autant que vu le nombre de réponses sur les forums... Je sais, j'ai été modo moi aussi, et je pense bien avoir tout essayé. Enfin, non, pas tout, puisque je n'ai pas encore trouvé ;)
Il faut que je génère un grand nombre de nombres aléatoires (simulation de lois normales, si vous voulez tout savoir), le tout en C/C++.
Alors, au début du main, une seule fois :
srand((unsigned int) time(NULL));
pif = (float)rand() / ((float)RAND_MAX + 1.0) ;
for (i) {srand (i) ; rand();}) ne fonctionne pas non plus.
Configuration: Windows XP Firefox 1.5.0.9
Ah oui mais en fait c'est parce que la graine devrait être initialisée une et une seule fois
|
Salut.
|
La fonction rand n'est pas une réelle fonction aléatoire, elle génère un nombre à partir d'un algo compliqué qui tire sa variable à partir du processeur (je crois que c'est l'horloge mais pas sûr).
|
'rci à tous !
unsigned long prng(unsigned long state)
{
return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
}
(apparemment utilisé par entre autres vlc pour les sons). Je n'ai pas tout pigé, une sorte de /dev/random pour les pauvres ? En gros, si ça peut servir à quelqu'un : -> srand((unsigned int) time(NULL)); dans le main au tout début -> cette fonction prng() {} -> prng(rand()) pour avoir un nombre au pif entre -2^31 et 2^31 |
Salut, quand tu fais pif = (float)rand() / ((float)RAND_MAX + 1.0) ; tu génère un nombre pseudo-aléatoire suivant la loi uniforme et non la loi normale. Voici ce que je fais pour la loi normale :
#define TWOPI (6.2831853071795864769252867665590057683943387987502) /* 2 * pi */
/*
RAND is a macro which returns a pseudo-random numbers from a uniform
distribution on the interval [0 1]
*/
#define RAND (rand())/((double) RAND_MAX)
/*
RANDN is a macro which returns a pseudo-random numbers from a normal
distribution with mean zero and standard deviation one. This macro uses Box
Muller's algorithm
*/
#define RANDN (sqrt(-2.0*log(RAND))*cos(TWOPI*RAND))
double NormalDistribution(double mu,double sigma)
{
/*
This function returns a pseudo-random number from a normal distribution with
mean equal at mu and standard deviation equal at sigma > 0
*/
if(sigma<=0.)
{
fprintf(stderr,"Error in file %s line %u function %s : sigma must be > 0\nExit program\n",__FILE__,__LINE__,__FUNCTION__);
MPI_Finalize();
exit(EXIT_FAILURE);
}
return (mu+sigma*RANDN);
}
et tu fais ensuite une boucle for pour tirer 50000 tirages. |
Répondre à Char Snipeur
|
Ok, merci pour la traduction.
|
Il y a quantité d'algo sur Internet. Cherche "Random number" avec Google et tu en auras une palanqué. Exemple :
|
Fais un tit tour sur mon site :
|
Sinon tu fais un tableau de nombres aléatoires, tu prends au hasard le nombre d'une case de ce tableau et tu le remplac e par un autre nombre aléatoire.
|