diff options
Diffstat (limited to 'random')
-rw-r--r-- | random/CMakeLists.txt | 3 | ||||
-rw-r--r-- | random/include/random/normal.h | 9 | ||||
-rw-r--r-- | random/include/random/random.h | 2 | ||||
-rw-r--r-- | random/src/normal.c | 17 |
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) | |||
3 | project(random) | 3 | project(random) |
4 | 4 | ||
5 | add_library(random | 5 | add_library(random |
6 | src/mt19937-64.c) | 6 | src/mt19937-64.c |
7 | src/normal.c) | ||
7 | 8 | ||
8 | target_include_directories(random PUBLIC include) | 9 | target_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). | ||
6 | void normal2(double u, double v, double* z0, double* z1); | ||
7 | |||
8 | /// Map a sample from a standard normal distribution to an arbitrary normal. | ||
9 | double 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 | ||
8 | void 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 | |||
15 | double normal_transform(double z, double mu, double sigma) { | ||
16 | return z*sigma + mu; | ||
17 | } | ||