X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Frandom.c;h=e6db94c1501f06f606d8fc1af86c4897dcc8d43f;hb=d2f8593a1f1d39a3264682af0da898a3d67b68cf;hp=cae3f9e70a3fb9f0f05411bfa3114509d9fd768c;hpb=d52bdc878fbdfa043118c59bec4b24b239724904;p=pspp diff --git a/src/random.c b/src/random.c index cae3f9e70a..e6db94c150 100644 --- a/src/random.c +++ b/src/random.c @@ -19,7 +19,7 @@ #include #include "random.h" -#include +#include "error.h" #include #include #include @@ -40,15 +40,40 @@ struct rng double next_normal; }; + +/* Return a `random' seed by using the real time clock */ +unsigned long +random_seed(void) +{ + time_t t; + + time(&t); + + return (unsigned long) t; +} + /* Creates a new random number generator, seeds it based on the current time, and returns it. */ struct rng * rng_create (void) { struct rng *rng; - static time_t t=0; + static unsigned long seed=0; + unsigned long s; rng = xmalloc (sizeof *rng); + + + if ( seed_is_set(&s) ) + { + seed = s; + } + else if ( seed == 0 ) + { + seed = random_seed(); + } + assert(seed); + /* if (t == 0 || set_seed_used) { if (set_seed == NOT_LONG) @@ -59,7 +84,8 @@ rng_create (void) } else t++; - rng_seed (rng, &t, sizeof t); + */ + rng_seed (rng, &seed, sizeof seed); rng->next_normal = NOT_DOUBLE; return rng; }