X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fprng%2Frandom.c;h=e250e28e98919eca4f3c9e880b9de54ba23d2fd5;hb=0a8d98285f46f721dabf38485df916c02d6a4675;hp=cc5702ed87b003275320e08242d794c8e5a78e36;hpb=f7dff1852b996363061e04531a15a3403351c375;p=musl diff --git a/src/prng/random.c b/src/prng/random.c index cc5702ed..e250e28e 100644 --- a/src/prng/random.c +++ b/src/prng/random.c @@ -1,10 +1,3 @@ -/* - * random.c - Copyright © 2011 Szabolcs Nagy - * Permission to use, copy, modify, and/or distribute this code - * for any purpose with or without fee is hereby granted. - * There is no warranty. -*/ - #include #include #include "libc.h" @@ -12,11 +5,7 @@ /* this code uses the same lagged fibonacci generator as the original bsd random implementation except for the seeding - -different seeds produce different sequences with long period -(other libcs seed the state with a park-miller generator -when seed=0 some fail to produce good random sequence -others produce the same sequence as another seed) +which was broken in the original */ static uint32_t init[] = { @@ -33,7 +22,7 @@ static int n = 31; static int i = 3; static int j = 0; static uint32_t *x = init+1; -static int lock; +static int lock[2]; static uint32_t lcg31(uint32_t x) { return (1103515245*x + 12345) & 0x7fffffff; @@ -74,9 +63,9 @@ static void __srandom(unsigned seed) { } void srandom(unsigned seed) { - LOCK(&lock); + LOCK(lock); __srandom(seed); - UNLOCK(&lock); + UNLOCK(lock); } char *initstate(unsigned seed, char *state, size_t size) { @@ -84,7 +73,7 @@ char *initstate(unsigned seed, char *state, size_t size) { if (size < 8) return 0; - LOCK(&lock); + LOCK(lock); old = savestate(); if (size < 32) n = 0; @@ -98,24 +87,25 @@ char *initstate(unsigned seed, char *state, size_t size) { n = 63; x = (uint32_t*)state + 1; __srandom(seed); - UNLOCK(&lock); + savestate(); + UNLOCK(lock); return old; } char *setstate(char *state) { void *old; - LOCK(&lock); + LOCK(lock); old = savestate(); loadstate((uint32_t*)state); - UNLOCK(&lock); + UNLOCK(lock); return old; } long random(void) { long k; - LOCK(&lock); + LOCK(lock); if (n == 0) { k = x[0] = lcg31(x[0]); goto end; @@ -127,6 +117,6 @@ long random(void) { if (++j == n) j = 0; end: - UNLOCK(&lock); + UNLOCK(lock); return k; }