aboutsummaryrefslogtreecommitdiff
path: root/sys/libn/random.c
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-09-08 15:51:40 -0700
committerNicholas Noll <nbnoll@eml.cc>2021-09-08 15:51:53 -0700
commitc0a7b53baf2a6e7bf9bc1fbec7ac05e43ac59154 (patch)
tree385b83f4d505da960820932f7357eb46b31abac3 /sys/libn/random.c
parent8c0475f97675245d1bcbb112dc79c9f490fad361 (diff)
checkin
Diffstat (limited to 'sys/libn/random.c')
-rw-r--r--sys/libn/random.c35
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;
+}