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