X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=inline;f=src%2Fprng%2Frandom.c;h=633a17f6902fcf9e287c0ecbc921304513bf23a9;hb=1e7f0fcd7ff2096904fd93a2ee6d12a2392be392;hp=4ad62058db7ecbcd83e5cc5a395ba1fa2e45ff03;hpb=4750cf4202c29a895639b89099a7bdbe9ae422b6;p=musl diff --git a/src/prng/random.c b/src/prng/random.c index 4ad62058..633a17f6 100644 --- a/src/prng/random.c +++ b/src/prng/random.c @@ -1,22 +1,11 @@ -/* - * 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" +#include "lock.h" /* 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[2]; +static volatile int lock[1]; static uint32_t lcg31(uint32_t x) { return (1103515245*x + 12345) & 0x7fffffff; @@ -98,6 +87,7 @@ char *initstate(unsigned seed, char *state, size_t size) { n = 63; x = (uint32_t*)state + 1; __srandom(seed); + savestate(); UNLOCK(lock); return old; }