diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-09-08 15:51:40 -0700 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-09-08 15:51:53 -0700 |
commit | c0a7b53baf2a6e7bf9bc1fbec7ac05e43ac59154 (patch) | |
tree | 385b83f4d505da960820932f7357eb46b31abac3 /sys/libn/random.c | |
parent | 8c0475f97675245d1bcbb112dc79c9f490fad361 (diff) |
checkin
Diffstat (limited to 'sys/libn/random.c')
-rw-r--r-- | sys/libn/random.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/sys/libn/random.c b/sys/libn/random.c index 558641e..551d1e9 100644 --- a/sys/libn/random.c +++ b/sys/libn/random.c @@ -1,4 +1,5 @@ #include <u.h> +#include <libn.h> // ---------------------------------------------------------------------------- // Internal structure @@ -66,12 +67,29 @@ rng·init(uint64 seed) /* Returns a random float64 between 0 and 1 */ double -rng·random() +rng·random(void) { uint64 r = xoshiro256ss(&RNG); return (double)r / (double)UINT64_MAX; } +double +rng·exponential(double lambda) +{ + double f; + + f = rng·random(); + return -log(1 - f)/lambda; +} + +double +rng·normal(void) +{ + double f; + f = rng·random(); + +} + /* Returns true or false on success of trial */ bool rng·bernoulli(double f) @@ -88,3 +106,18 @@ rng·randi(int max) uint64 r = xoshiro256ss(&RNG); return r % max; } + +uint64 +rng·poisson(double mean) +{ + uint64 n; + double c; + + if(mean<10.0) { + for(n=0, c=rng·exponential(1.0); c<mean; ++n, c+=rng·exponential(1.0)) + ; + return n; + } + + return 0; +} |