/* module function */ static VALUE rb_gsl_rng_types_setup(VALUE obj) { const gsl_rng_type **t, **t0; VALUE ary; t0 = gsl_rng_types_setup(); ary = rb_ary_new(); for (t = t0; *t != 0; t++) rb_ary_push(ary, rb_str_new2((*t)->name)); return ary; }
/* rng_types_length returns the number of rng types available */ size_t rng_types_length() { size_t length = 0; const gsl_rng_type **t0 = gsl_rng_types_setup(); for (const gsl_rng_type **t = t0; *t != 0; t++) { length++; } return length; }
void GslRandomgen::InitializeTables() { // initialize table of random number generators: if( !GslRandomgen::initialized ) { gsl_rng_env_setup(); // get default values // get rng types GslRandomgen::gslalg_randomgeneratorTable = gsl_rng_types_setup(); GslRandomgen::gslalg_randomgeneratorTableSize = 0; GslRandomgen::gsl_rng_defaultIndex = 0; while(GslRandomgen::gslalg_randomgeneratorTable[ GslRandomgen::gslalg_randomgeneratorTableSize] != NULL) { if( GslRandomgen::gslalg_randomgeneratorTable[ GslRandomgen::gslalg_randomgeneratorTableSize]->set == gsl_rng_default->set ) { GslRandomgen::gsl_rng_defaultIndex = GslRandomgen::gslalg_randomgeneratorTableSize; } GslRandomgen::gslalg_randomgeneratorTableSize++; } GslRandomgen::initialized = true; } }
int main (void) { #if XY const gsl_rng_type ** rngs = gsl_rng_types_setup(); /* get all rng types */ const gsl_rng_type ** r ; gsl_ieee_env_setup (); gsl_rng_env_setup (); /* specific tests of known results for 10000 iterations with seed = 1 */ rng_test (gsl_rng_rand, 1, 10000, 1910041713); rng_test (gsl_rng_randu, 1, 10000, 1623524161); rng_test (gsl_rng_cmrg, 1, 10000, 719452880); rng_test (gsl_rng_minstd, 1, 10000, 1043618065); rng_test (gsl_rng_mrg, 1, 10000, 2064828650); rng_test (gsl_rng_taus, 1, 10000, 2733957125UL); rng_test (gsl_rng_taus113, 1, 1000, 1925420673UL); rng_test (gsl_rng_transputer, 1, 10000, 1244127297UL); rng_test (gsl_rng_vax, 1, 10000, 3051034865UL); /* Borosh13 test value from PARI: (1812433253^10000)%(2^32) */ rng_test (gsl_rng_borosh13, 1, 10000, 2513433025UL); /* Fishman18 test value from PARI: (62089911^10000)%(2^31-1) */ rng_test (gsl_rng_fishman18, 1, 10000, 330402013UL); /* Fishman2x test value from PARI: ((48271^10000)%(2^31-1) - (40692^10000)%(2^31-249))%(2^31-1) */ rng_test (gsl_rng_fishman2x, 1, 10000, 540133597UL); /* Knuthran2 test value from PARI: { xn1=1; xn2=1; for (n=1,10000, xn = (271828183*xn1 - 314159269*xn2)%(2^31-1); xn2=xn1; xn1=xn; print(xn); ) } */ rng_test (gsl_rng_knuthran2, 1, 10000, 1084477620UL); /* Knuthran test value taken from p188 in Knuth Vol 2. 3rd Ed */ rng_test (gsl_rng_knuthran, 310952, 1009 * 2009 + 1, 461390032); /* Lecuyer21 test value from PARI: (40692^10000)%(2^31-249) */ rng_test (gsl_rng_lecuyer21, 1, 10000, 2006618587UL); /* Waterman14 test value from PARI: (1566083941^10000)%(2^32) */ rng_test (gsl_rng_waterman14, 1, 10000, 3776680385UL); /* specific tests of known results for 10000 iterations with seed = 6 */ /* Coveyou test value from PARI: x=6; for(n=1,10000,x=(x*(x+1))%(2^32);print(x);) */ rng_test (gsl_rng_coveyou, 6, 10000, 1416754246UL); /* Fishman20 test value from PARI: (6*48271^10000)%(2^31-1) */ rng_test (gsl_rng_fishman20, 6, 10000, 248127575UL); /* FIXME: the ranlux tests below were made by running the fortran code and getting the expected value from that. An analytic calculation would be preferable. */ rng_test (gsl_rng_ranlux, 314159265, 10000, 12077992); rng_test (gsl_rng_ranlux389, 314159265, 10000, 165942); rng_test (gsl_rng_ranlxs0, 1, 10000, 11904320); /* 0.709552764892578125 * ldexp(1.0,24) */ rng_test (gsl_rng_ranlxs1, 1, 10000, 8734328); /* 0.520606517791748047 * ldexp(1.0,24) */ rng_test (gsl_rng_ranlxs2, 1, 10000, 6843140); /* 0.407882928848266602 * ldexp(1.0,24) */ rng_test (gsl_rng_ranlxd1, 1, 10000, 1998227290UL); /* 0.465248546261094020 * ldexp(1.0,32) */ rng_test (gsl_rng_ranlxd2, 1, 10000, 3949287736UL); /* 0.919515205581550532 * ldexp(1.0,32) */ /* FIXME: the tests below were made by running the original code in the ../random directory and getting the expected value from that. An analytic calculation would be preferable. */ rng_test (gsl_rng_slatec, 1, 10000, 45776); rng_test (gsl_rng_uni, 1, 10000, 9214); rng_test (gsl_rng_uni32, 1, 10000, 1155229825); rng_test (gsl_rng_zuf, 1, 10000, 3970); /* The tests below were made by running the original code and getting the expected value from that. An analytic calculation would be preferable. */ rng_test (gsl_rng_r250, 1, 10000, 1100653588); rng_test (gsl_rng_mt19937, 4357, 1000, 1186927261); rng_test (gsl_rng_mt19937_1999, 4357, 1000, 1030650439); rng_test (gsl_rng_mt19937_1998, 4357, 1000, 1309179303); rng_test (gsl_rng_tt800, 0, 10000, 2856609219UL); rng_test (gsl_rng_ran0, 0, 10000, 1115320064); rng_test (gsl_rng_ran1, 0, 10000, 1491066076); rng_test (gsl_rng_ran2, 0, 10000, 1701364455); #endif rng_test (gsl_rng_ran3, 0, 10000, 186340785); #if XY rng_test (gsl_rng_ranmar, 1, 10000, 14428370); rng_test (gsl_rng_rand48, 0, 10000, 0xDE095043UL); rng_test (gsl_rng_rand48, 1, 10000, 0xEDA54977UL); rng_test (gsl_rng_random_glibc2, 0, 10000, 1908609430); rng_test (gsl_rng_random8_glibc2, 0, 10000, 1910041713); rng_test (gsl_rng_random32_glibc2, 0, 10000, 1587395585); rng_test (gsl_rng_random64_glibc2, 0, 10000, 52848624); rng_test (gsl_rng_random128_glibc2, 0, 10000, 1908609430); rng_test (gsl_rng_random256_glibc2, 0, 10000, 179943260); rng_test (gsl_rng_random_bsd, 0, 10000, 1457025928); rng_test (gsl_rng_random8_bsd, 0, 10000, 1910041713); rng_test (gsl_rng_random32_bsd, 0, 10000, 1663114331); rng_test (gsl_rng_random64_bsd, 0, 10000, 864469165); rng_test (gsl_rng_random128_bsd, 0, 10000, 1457025928); rng_test (gsl_rng_random256_bsd, 0, 10000, 1216357476); rng_test (gsl_rng_random_libc5, 0, 10000, 428084942); rng_test (gsl_rng_random8_libc5, 0, 10000, 1910041713); rng_test (gsl_rng_random32_libc5, 0, 10000, 1967452027); rng_test (gsl_rng_random64_libc5, 0, 10000, 2106639801); rng_test (gsl_rng_random128_libc5, 0, 10000, 428084942); rng_test (gsl_rng_random256_libc5, 0, 10000, 116367984); rng_test (gsl_rng_ranf, 0, 10000, 2152890433UL); rng_test (gsl_rng_ranf, 2, 10000, 339327233); /* Test constant relationship between int and double functions */ for (r = rngs ; *r != 0; r++) rng_float_test (*r); /* Test save/restore functions */ for (r = rngs ; *r != 0; r++) rng_state_test (*r); for (r = rngs ; *r != 0; r++) rng_parallel_state_test (*r); for (r = rngs ; *r != 0; r++) rng_read_write_test (*r); /* generic statistical tests (these are just to make sure that we don't get any crazy results back from the generator, i.e. they aren't a test of the algorithm, just the implementation) */ for (r = rngs ; *r != 0; r++) generic_rng_test (*r); exit (gsl_test_summary ()); #endif }
const gsl_rng_type * gsl_rng_env_setup (void) { unsigned long int seed = 0; const char *p = getenv ("GSL_RNG_TYPE"); if (p) { const gsl_rng_type **t, **t0 = gsl_rng_types_setup (); gsl_rng_default = 0; /* check GSL_RNG_TYPE against the names of all the generators */ for (t = t0; *t != 0; t++) { if (strcmp (p, (*t)->name) == 0) { gsl_rng_default = *t; break; } } if (gsl_rng_default == 0) { int i = 0; fprintf (stderr, "GSL_RNG_TYPE=%s not recognized\n", p); fprintf (stderr, "Valid generator types are:\n"); for (t = t0; *t != 0; t++) { fprintf (stderr, " %18s", (*t)->name); if ((++i) % 4 == 0) { fputc ('\n', stderr); } } fputc ('\n', stderr); //GSL_ERROR_VAL ("unknown generator", GSL_EINVAL, 0); abort(); } fprintf (stderr, "GSL_RNG_TYPE=%s\n", gsl_rng_default->name); } else { gsl_rng_default = gsl_rng_taus; } p = getenv ("GSL_RNG_SEED"); if (p) { seed = strtoul (p, 0, 0); fprintf (stderr, "GSL_RNG_SEED=%lu\n", seed); }; gsl_rng_default_seed = seed; return gsl_rng_default; }