This is the mail archive of the
gsl-discuss@sources.redhat.com
mailing list for the GSL project.
Re: fprintf(stderr,...) output in GSL routines (gsl_rng_env_setup)
- To: Brian Gough <bjg at network-theory dot co dot uk>
- Subject: Re: fprintf(stderr,...) output in GSL routines (gsl_rng_env_setup)
- From: Peter Teuben <teuben at astro dot umd dot edu>
- Date: Sun, 9 Sep 2001 10:38:19 -0400 (EDT)
- cc: gsl-discuss at sourceware dot cygnus dot com
> The environment variables are completely optional -- they are only
> used if you explicitly call gsl_rng_env_setup(). You can set the
> parameters by direct assignment in C. e.g.
>
> #include <gsl/gsl_rng.h>
>
> int main () {
> ....
> gsl_rng_default_seed = 123;
> gsl_rng_default_type = gsl_rng_ran3 ;
>
yes, I understood that also from the example, but i actually like the
idea of the user giving control of the random number generator. So in
the code the user can supply
seed=0,ran3
where they are both optional. The method of assigning to gsl_rng_default_type
would require me to manually build a large list of (to me officially unknown)
names, whereas the putenv() method has the nice side-effect that if you
say
seed=0,help
you get
...
Valid generator types are:
cmrg gfsr4 minstd mrg
mt19937 r250 ran0 ran1
ran2 ran3 rand48 rand
random128-bsd random128-glibc2 random128-libc5 random256-bsd
random256-glibc2 random256-libc5 random32-bsd random32-glibc2
random32-libc5 random64-bsd random64-glibc2 random64-libc5
random8-bsd random8-glibc2 random8-libc5 random-bsd
random-glibc2 random-libc5 randu ranf
ranlux389 ranlux ranlxd1 ranlxd2
ranlxs0 ranlxs1 ranlxs2 ranmar
slatec taus transputer tt800
uni32 uni vax zuf
so, I got the following code from that idea:
is = burststring(init,", "); /* parse init as "[seed[,name]]" */
nis = xstrlen(is,sizeof(string))-1;
if (nis > 0) { /* seed is first, but optional */
iseed = natoi(is[0]);
if (iseed > 0 || streq(is[0],"+0")) {
sprintf(my_gsl_seed,"%s=%s",env_seed,is[0]);
} else {
iseed = set_xrandom(iseed);
sprintf(my_gsl_seed,"%s=%u",env_seed,iseed);
}
putenv(my_gsl_seed);
if (nis > 1) { /* name is second, also optional */
sprintf(my_gsl_type,"%s=%s",env_type,is[1]);
putenv(my_gsl_type);
}
}
gsl_rng_env_setup(); /* initialize the rng (name/seed) setup */
my_T = gsl_rng_default;
my_r = gsl_rng_alloc(my_T);
dprintf(1,"GSL generator type: %s\n",gsl_rng_name(my_r));
dprintf(1,"GSL seed = %u\n",gsl_rng_default_seed);
dprintf(1,"GSL first value = %u\n",gsl_rng_get(my_r));
You can see a call to set_xrandom(), that replaces a seed of 0,-1,-2 by
seconds since 1970, clock-cycles or PID as seed. We found that to be useful
for simulations. In linux there is also /dev/random, but I haven't
been able to use that.
peter