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 ![[:petrus75] [:petrus75]](https://forum-images.hardware.fr/images/perso/petrus75.gif) ?
 ?
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