diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-02-12 00:22:29 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-02-12 00:22:29 -0500 |
commit | 0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 (patch) | |
tree | 6eaef0d8a720fa3da580de87b647fff796fe80b3 /src/prng | |
download | musl-0b44a0315b47dd8eced9f3b7f31580cf14bbfc01.tar.gz musl-0b44a0315b47dd8eced9f3b7f31580cf14bbfc01.tar.xz musl-0b44a0315b47dd8eced9f3b7f31580cf14bbfc01.zip |
initial check-in, version 0.5.0 v0.5.0
Diffstat (limited to 'src/prng')
-rw-r--r-- | src/prng/__rand48_step.c | 14 | ||||
-rw-r--r-- | src/prng/__seed48.c | 1 | ||||
-rw-r--r-- | src/prng/drand48.c | 19 | ||||
-rw-r--r-- | src/prng/lcong48.c | 9 | ||||
-rw-r--r-- | src/prng/lrand48.c | 15 | ||||
-rw-r--r-- | src/prng/mrand48.c | 15 | ||||
-rw-r--r-- | src/prng/rand.c | 13 | ||||
-rw-r--r-- | src/prng/rand_r.c | 6 | ||||
-rw-r--r-- | src/prng/random.c | 8 | ||||
-rw-r--r-- | src/prng/seed48.c | 12 | ||||
-rw-r--r-- | src/prng/srand48.c | 6 | ||||
-rw-r--r-- | src/prng/srandom.c | 8 |
12 files changed, 126 insertions, 0 deletions
diff --git a/src/prng/__rand48_step.c b/src/prng/__rand48_step.c new file mode 100644 index 00000000..755b4f2f --- /dev/null +++ b/src/prng/__rand48_step.c @@ -0,0 +1,14 @@ +#include <stdlib.h> +#include <inttypes.h> + +uint64_t __rand48_step(unsigned short *xi, unsigned short *lc) +{ + uint64_t a, x; + x = xi[0] | xi[1]<<16 | xi[2]+0ULL<<32; + a = lc[0] | lc[1]<<16 | lc[2]+0ULL<<32; + x = a*x + lc[3]; + xi[0] = x; + xi[1] = x>>16; + xi[2] = x>>32; + return x & 0xffffffffffffull; +} diff --git a/src/prng/__seed48.c b/src/prng/__seed48.c new file mode 100644 index 00000000..05a4539e --- /dev/null +++ b/src/prng/__seed48.c @@ -0,0 +1 @@ +unsigned short __seed48[7] = { 0, 0, 0, 0xe66d, 0xdeec, 0x5, 0xb }; diff --git a/src/prng/drand48.c b/src/prng/drand48.c new file mode 100644 index 00000000..d808353c --- /dev/null +++ b/src/prng/drand48.c @@ -0,0 +1,19 @@ +#include <stdlib.h> +#include <inttypes.h> + +uint64_t __rand48_step(unsigned short *xi, unsigned short *lc); +extern unsigned short __seed48[7]; + +double erand48(unsigned short s[3]) +{ + union { + uint64_t u; + double f; + } x = { 0x3ff0000000000000ULL | __rand48_step(s, __seed48+3)<<4 }; + return x.f - 1.0; +} + +double drand48(void) +{ + return erand48(__seed48); +} diff --git a/src/prng/lcong48.c b/src/prng/lcong48.c new file mode 100644 index 00000000..32b27d42 --- /dev/null +++ b/src/prng/lcong48.c @@ -0,0 +1,9 @@ +#include <stdlib.h> +#include <string.h> + +extern unsigned short __seed48[7]; + +void lcong48(unsigned short p[7]) +{ + memcpy(__seed48, p, sizeof __seed48); +} diff --git a/src/prng/lrand48.c b/src/prng/lrand48.c new file mode 100644 index 00000000..a3c4e4e2 --- /dev/null +++ b/src/prng/lrand48.c @@ -0,0 +1,15 @@ +#include <stdlib.h> +#include <inttypes.h> + +uint64_t __rand48_step(unsigned short *xi, unsigned short *lc); +extern unsigned short __seed48[7]; + +long nrand48(unsigned short s[3]) +{ + return __rand48_step(s, __seed48+3) >> 17; +} + +long lrand48(void) +{ + return nrand48(__seed48); +} diff --git a/src/prng/mrand48.c b/src/prng/mrand48.c new file mode 100644 index 00000000..ee650fc3 --- /dev/null +++ b/src/prng/mrand48.c @@ -0,0 +1,15 @@ +#include <stdlib.h> +#include <inttypes.h> + +uint64_t __rand48_step(unsigned short *xi, unsigned short *lc); +extern unsigned short __seed48[7]; + +long jrand48(unsigned short s[3]) +{ + return __rand48_step(s, __seed48+3) >> 16; +} + +long mrand48(void) +{ + return jrand48(__seed48); +} diff --git a/src/prng/rand.c b/src/prng/rand.c new file mode 100644 index 00000000..e3ce6347 --- /dev/null +++ b/src/prng/rand.c @@ -0,0 +1,13 @@ +#include <stdlib.h> + +static unsigned seed; + +void srand(unsigned s) +{ + seed = s-1; +} + +int rand(void) +{ + return (seed = (seed+1) * 1103515245 + 12345 - 1)+1 & 0x7fffffff; +} diff --git a/src/prng/rand_r.c b/src/prng/rand_r.c new file mode 100644 index 00000000..e96cfba9 --- /dev/null +++ b/src/prng/rand_r.c @@ -0,0 +1,6 @@ +#include <stdlib.h> + +int rand_r(unsigned *seed) +{ + return (*seed = *seed * 1103515245 + 12345) & 0x7fffffff; +} diff --git a/src/prng/random.c b/src/prng/random.c new file mode 100644 index 00000000..e6b7fd1f --- /dev/null +++ b/src/prng/random.c @@ -0,0 +1,8 @@ +#include <stdlib.h> + +/* FIXME */ + +long random() +{ + return rand(); +} diff --git a/src/prng/seed48.c b/src/prng/seed48.c new file mode 100644 index 00000000..e0699c09 --- /dev/null +++ b/src/prng/seed48.c @@ -0,0 +1,12 @@ +#include <stdlib.h> +#include <string.h> + +extern unsigned short __seed48[7]; + +unsigned short *seed48(unsigned short *s) +{ + static unsigned short p[3]; + memcpy(p, __seed48, sizeof p); + memcpy(__seed48, s, sizeof p); + return p; +} diff --git a/src/prng/srand48.c b/src/prng/srand48.c new file mode 100644 index 00000000..0a56f6a0 --- /dev/null +++ b/src/prng/srand48.c @@ -0,0 +1,6 @@ +#include <stdlib.h> + +void srand48(long seed) +{ + seed48((unsigned short [3]){ 0x330e, seed, seed>>16 }); +} diff --git a/src/prng/srandom.c b/src/prng/srandom.c new file mode 100644 index 00000000..77f4dcbd --- /dev/null +++ b/src/prng/srandom.c @@ -0,0 +1,8 @@ +#include <stdlib.h> + +/* FIXME */ + +void srandom(unsigned seed) +{ + return srand(seed); +} |