static time_t t=0;
rng = xmalloc (sizeof *rng);
- if (t == 0 || set_seed == NOT_LONG)
+ if (t == 0 || set_seed_used)
{
if (set_seed == NOT_LONG)
time (&t);
else
t = set_seed;
+ set_seed_used=0;
}
else
t++;
double
rng_get_double (struct rng *rng)
{
- unsigned long value;
-
- rng_get_bytes (rng, &value, sizeof value);
- return value / (double) ULONG_MAX;
+ for (;;)
+ {
+ unsigned long ulng;
+ double dbl;
+
+ rng_get_bytes (rng, &ulng, sizeof ulng);
+ dbl = ulng / (ULONG_MAX + 1.0);
+ if (dbl >= 0 && dbl < 1)
+ return dbl;
+ }
}
/* Returns a random number from the distribution with mean 0 and