aboutsummaryrefslogtreecommitdiff
path: root/random
diff options
context:
space:
mode:
Diffstat (limited to 'random')
-rw-r--r--random/CMakeLists.txt3
-rw-r--r--random/include/random/normal.h9
-rw-r--r--random/include/random/random.h2
-rw-r--r--random/src/normal.c17
4 files changed, 30 insertions, 1 deletions
diff --git a/random/CMakeLists.txt b/random/CMakeLists.txt
index ec80b1d..188d16b 100644
--- a/random/CMakeLists.txt
+++ b/random/CMakeLists.txt
@@ -3,7 +3,8 @@ cmake_minimum_required(VERSION 3.0)
3project(random) 3project(random)
4 4
5add_library(random 5add_library(random
6 src/mt19937-64.c) 6 src/mt19937-64.c
7 src/normal.c)
7 8
8target_include_directories(random PUBLIC include) 9target_include_directories(random PUBLIC include)
9 10
diff --git a/random/include/random/normal.h b/random/include/random/normal.h
new file mode 100644
index 0000000..bee32a9
--- /dev/null
+++ b/random/include/random/normal.h
@@ -0,0 +1,9 @@
1#pragma once
2
3/// Generate two samples from the standard normal distribution.
4///
5/// |u| and |v| must be uniformly distributed in (0,1).
6void normal2(double u, double v, double* z0, double* z1);
7
8/// Map a sample from a standard normal distribution to an arbitrary normal.
9double normal_transform(double z, double mu, double sigma);
diff --git a/random/include/random/random.h b/random/include/random/random.h
index 5499f62..1f4a48d 100644
--- a/random/include/random/random.h
+++ b/random/include/random/random.h
@@ -1,3 +1,5 @@
1#pragma once 1#pragma once
2 2
3#include <random/mt19937-64.h> 3#include <random/mt19937-64.h>
4#include <random/normal.h>
5
diff --git a/random/src/normal.c b/random/src/normal.c
new file mode 100644
index 0000000..d4bcac1
--- /dev/null
+++ b/random/src/normal.c
@@ -0,0 +1,17 @@
1#include <random/normal.h>
2
3#include <math.h>
4
5// Generate two samples in the standard normal distribution using the
6// Box-Muller transform.
7// https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
8void normal2(double u, double v, double* z0, double* z1) {
9 const double r = sqrt(-2 * log(u));
10 const double x = 2 * M_PI * v;
11 *z0 = r * cos(x);
12 *z1 = r * sin(x);
13}
14
15double normal_transform(double z, double mu, double sigma) {
16 return z*sigma + mu;
17}