Gnu Scientific Library : besoin d'aide avec la génération de nombre al - C - Programmation
Marsh Posté le 15-05-2007 à 10:51:42
Il doit y avoir une fonction d'initialisation du générateur de nombre aléatoire, à utiliser avec l'heure par exemple.
Marsh Posté le 15-05-2007 à 10:52:49
mais encore
?
parce que j'ai copié sur l'exemple donné en ligne là ![[:spamafote] [:spamafote]](https://forum-images.hardware.fr/images/perso/spamafote.gif)
je pense que le probleme vient du fzait qu'a chaque nouvel appel de la fonction, le générateur est réinitialisé
Marsh Posté le 15-05-2007 à 11:01:16
ReplyMarsh Posté le 15-05-2007 à 11:03:30
merci et je mets quoi comme valeur de s pour qu'a chaque appel, il y ait une valeur de s différente ? ![]()
Marsh Posté le 15-05-2007 à 11:07:56
ben genre un time_t ![[:pingouino] [:pingouino]](https://forum-images.hardware.fr/images/perso/pingouino.gif)
Marsh Posté le 15-05-2007 à 11:13:56
Je ne connais pas la gsl mais ça m'étonnerait qu'il faille appeler gsl_rng_env_setup() à chaque génération de nombre. C'est ça qui doit réinitialiser le générateur à chaque appel (à 0, si la var d'environnement GSL_RNG_SEED n'est pas définie).
Marsh Posté le 15-05-2007 à 11:14:51
bon j'ai mis ça il me sort un segmentation fault
double determ_tps_inf(double beta, int nbi,int N,int nbs)
{
const gsl_rng_type * T1;
gsl_rng * r1;
double mu,tps_infection,Nd,inter;
int i;
time_t * s;
Nd = (double) N;
// c'est la moyenne de la loi exponentielle
mu = (double) beta*nbi/Nd;
/* create a generator chosen by the
environment variable GSL_RNG_TYPE */
gsl_rng_env_setup();
s = malloc(sizeof(time_t));
T1 = gsl_rng_default;
r1 = gsl_rng_alloc (T1);
time(s);
gsl_rng_set (r1,(*s)); // segmentation fault sur cette ligne ![]()
// on tire un nombre dans la loi gamma, et on le place dans le vecteur tps_period
inter = gsl_ran_exponential(r1,mu);
// on libère la mémoire allouée pour r1
gsl_rng_free (r1);
return inter;
}
je pige pas ![[:zytrasnif] [:zytrasnif]](https://forum-images.hardware.fr/images/perso/zytrasnif.gif)
Marsh Posté le 15-05-2007 à 11:15:36
| matafan a écrit : Je ne connais pas la gsl mais ça m'étonnerait qu'il faille appeler gsl_rng_env_setup() à chaque génération de nombre. C'est ça qui doit réinitialiser le générateur à chaque appel (à 0, si la var d'environnement GSL_RNG_SEED n'est pas définie). |
ahhhhhhhhhhhhhhhh merci !!!
Marsh Posté le 15-05-2007 à 11:17:54
Allez relis la doc et calme toi.
ca ca devrait aller
Code :
|
mes balises spoiler elles marchent pas ![[:zytrasnif] [:zytrasnif]](https://forum-images.hardware.fr/images/perso/zytrasnif.gif)
Marsh Posté le 15-05-2007 à 11:19:55
non connerie ![]()
Marsh Posté le 15-05-2007 à 15:03:14
Désolé je n'y arrive pas
j'ai modifié le code avec les time_t
mais ca me sort les memes nombres car les tirages sont faits de façon extremement rapproché
par contre ca change d'une execution a une autre
mais il faudrait que ca puisse changer alors que les tirages sont faits les uns a la suite des autres ![]()
Marsh Posté le 15-05-2007 à 15:31:29
Il ne faut PAS toucher au seed du générateur dans ta fonction. Le générateur doit être initialisé en dehors de ta fonction.
Marsh Posté le 15-05-2007 à 10:49:27
Boin voilà j'ai écris un programme en C générant des nombres aléatoires via une distribution exponentielle
mais j'ai un problème
j'ai mis la fonction gsl_ran_exponantial dans une fonction a part et je l'appelle a partir du main
exemple :
double generation(double beta, int nbi,int N,int nbs)
{
const gsl_rng_type * T1;
gsl_rng * r1;
double mu,tps_infection,Nd,inter;
Nd = (double) N;
// c'est la moyenne de la loi exponentielle
mu = (double) beta*nbi/Nd;
/* create a generator chosen by the
environment variable GSL_RNG_TYPE */
gsl_rng_env_setup();
T1 = gsl_rng_default;
r1 = gsl_rng_alloc (T1);
inter = gsl_ran_exponential(r1,mu);
// on libère la mémoire allouée pour r1
gsl_rng_free (r1);
return inter;
}
le probleme c'est qu'avec les memes paramètres beta,Nd et nbi le meme nombre est toujours généré meme apres plusieurs appels de la fonction
comment y remédier ?
je vous remercie d'avance