diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-03-14 00:26:37 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-03-14 00:26:37 -0700 |
commit | 62ec2d2ec9d427866c9dea6fc507ea1c7976fb0f (patch) | |
tree | 1a964b4a1c99a8d1c170655c2e9fb7bbc9b51e98 /rand.c | |
parent | 9753507cc7c47f080606ba86b280a7d6a2b212be (diff) | |
download | txr-62ec2d2ec9d427866c9dea6fc507ea1c7976fb0f.tar.gz txr-62ec2d2ec9d427866c9dea6fc507ea1c7976fb0f.tar.bz2 txr-62ec2d2ec9d427866c9dea6fc507ea1c7976fb0f.zip |
* eval.c (eval_init): Make seed argument optional in make-random-state.
* rand.c (make_random_state): Do argument defaulting on seed.
Also, mix getpid() into the seed.
(random_fixnum): Bugfix: do proper defaulting on optional
agument, rather than relying on nil.
(random): Fix 2014-02-05 regression. This was totally broken,
ignoring the random state passed in and using the global
random state. This function must only use the state passed in;
there is no defaulting to the global random state.
* txr.1: Documenting that seed is optional in make-random-state.
Describing what guarantees can be expected with regard to
calls made close together temporally.
Diffstat (limited to 'rand.c')
-rw-r--r-- | rand.c | 15 |
1 files changed, 10 insertions, 5 deletions
@@ -37,6 +37,9 @@ #include <time.h> #include <signal.h> #include "config.h" +#if HAVE_UNISTD_H +#include <unistd.h> +#endif #include "lib.h" #include "signal.h" #include "unwind.h" @@ -110,6 +113,8 @@ val make_random_state(val seed) r->cur = 0; + seed = default_bool_arg(seed); + if (bignump(seed)) { int i, dig, bit; mp_int *m = mp(seed); @@ -139,7 +144,8 @@ val make_random_state(val seed) val time = time_sec_usec(); r->state[0] = (rand32_t) c_num(car(time)); r->state[1] = (rand32_t) c_num(cdr(time)); - memset(r->state + 2, 0xAA, sizeof r->state - 2 * sizeof r->state[0]); + r->state[2] = (rand32_t) getpid(); + memset(r->state + 3, 0xAA, sizeof r->state - 3 * sizeof r->state[0]); } else if (random_state_p(seed)) { struct rand_state *rseed = (struct rand_state *) cobj_handle(seed, random_state_s); @@ -157,16 +163,15 @@ val make_random_state(val seed) val random_fixnum(val state) { - uses_or2; - struct rand_state *r = (struct rand_state *) cobj_handle(or2(state, - random_state), + struct rand_state *r = (struct rand_state *) cobj_handle(default_arg(state, + random_state), random_state_s); return num(rand32(r) & NUM_MAX); } val random(val state, val modulus) { - struct rand_state *r = (struct rand_state *) cobj_handle(random_state, + struct rand_state *r = (struct rand_state *) cobj_handle(state, random_state_s); if (bignump(modulus)) { |