From 406a1bc7bbfd2c7d241946c23ede8ec59fd436e2 Mon Sep 17 00:00:00 2001 From: ache Date: Tue, 4 Feb 2003 11:24:08 +0000 Subject: For rand(3) and random(3) TYPE_0 drop NSHUFF values right after srand{om}() to remove part of seed -> 1st value correlation. Correlation still remains because of algorithm limits. Note that old algorithm have even stronger correlation, especially in the lower bits area, but not eye-visible, as current one. --- lib/libc/stdlib/rand.c | 8 +++++++- lib/libc/stdlib/random.c | 13 ++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) (limited to 'lib/libc') diff --git a/lib/libc/stdlib/rand.c b/lib/libc/stdlib/rand.c index 47bb36d..dcc445f 100644 --- a/lib/libc/stdlib/rand.c +++ b/lib/libc/stdlib/rand.c @@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$"); #include #endif /* TEST */ +#define NSHUFF 100 /* to drop part of seed -> 1st value correlation */ + static int do_rand(unsigned long *ctx) { @@ -108,7 +110,11 @@ void srand(seed) u_int seed; { + int i; + next = seed; + for (i = 0; i < NSHUFF; i++) + (void)do_rand(&next); } @@ -137,7 +143,7 @@ sranddev() unsigned long junk; gettimeofday(&tv, NULL); - next = (getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk; + srand((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk); } } diff --git a/lib/libc/stdlib/random.c b/lib/libc/stdlib/random.c index 82af94c..64310cd 100644 --- a/lib/libc/stdlib/random.c +++ b/lib/libc/stdlib/random.c @@ -142,6 +142,8 @@ __FBSDID("$FreeBSD$"); */ #define MAX_TYPES 5 /* max number of types above */ +#define NSHUFF 100 /* to drop part of seed -> 1st value correlation */ + static long degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; static long seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; @@ -264,19 +266,20 @@ void srandom(x) unsigned long x; { - long i; + long i, lim; + state[0] = x; if (rand_type == TYPE_0) - state[0] = x; + lim = NSHUFF; else { - state[0] = x; for (i = 1; i < rand_deg; i++) state[i] = good_rand(state[i - 1]); fptr = &state[rand_sep]; rptr = &state[0]; - for (i = 0; i < 10 * rand_deg; i++) - (void)random(); + lim = 10 * rand_deg; } + for (i = 0; i < lim; i++) + (void)random(); } /* -- cgit v1.1