Gnu Scientific Library : besoin d'aide avec la génération de nombre al

Gnu Scientific Library : besoin d'aide avec la génération de nombre al - C - Programmation

Marsh Posté le 15-05-2007 à 10:49:27    

[:augie] a tous !
 
 
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
 
:)

Reply

Marsh Posté le 15-05-2007 à 10:49:27   

Reply

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.


---------------
Töp of the plöp
Reply

Marsh Posté le 15-05-2007 à 10:52:49    

mais encore [:petrus75] ?

 

parce que j'ai copié sur l'exemple donné en ligne là [:spamafote]

 

je pense que le probleme vient du fzait qu'a chaque nouvel appel de la fonction, le générateur est réinitialisé


Message édité par Profil supprimé le 15-05-2007 à 10:54:29
Reply

Marsh Posté le 15-05-2007 à 11:00:28    

personne ? [:zytrasnif]

Reply

Marsh Posté le 15-05-2007 à 11:01:16    

Reply

Marsh 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 ? :p

Reply

Marsh Posté le 15-05-2007 à 11:07:56    

ben genre un time_t [:pingouino]


Message édité par _darkalt3_ le 15-05-2007 à 11:08:11

---------------
Töp of the plöp
Reply

Marsh Posté le 15-05-2007 à 11:08:18    

qu'est-ce ? [:jagstang]

Reply

Marsh Posté le 15-05-2007 à 11:09:15    

Google !


---------------
Töp of the plöp
Reply

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).

Reply

Marsh Posté le 15-05-2007 à 11:13:56   

Reply

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]


Message édité par Profil supprimé le 15-05-2007 à 11:15:11
Reply

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 !!!

Reply

Marsh Posté le 15-05-2007 à 11:17:54    

Allez relis la doc et calme toi.
ca ca devrait aller

Code :
  1. time_t maintenant;
  2. time(&maintenant);
  3. gsl_rng_set (r1,maintenant);
 


mes balises spoiler elles marchent pas [:zytrasnif]


Message édité par _darkalt3_ le 15-05-2007 à 11:24:37

---------------
Töp of the plöp
Reply

Marsh Posté le 15-05-2007 à 11:19:55    

non connerie :)


Message édité par Profil supprimé le 15-05-2007 à 15:02:00
Reply

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 :/

Reply

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.

Reply

Marsh Posté le 15-05-2007 à 15:33:49    

merci :)

Reply

Sujets relatifs:

Leave a Replay

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