-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexperiments.cpp
More file actions
51 lines (46 loc) · 1.91 KB
/
experiments.cpp
File metadata and controls
51 lines (46 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "iostream"
#include "vector"
#include "algorithm"
#include "random"
#include <cmath>
#include "includes/common.h"
struct sample_point {
double x;
double val;
};
int main() {
/*
* Generate random variable P from uniform distribution U
* where variable P has pdf(x)=exp(-x/2pi)*sin(x)^2
*/
int N = 100000;
double sum = 0.0;
std::vector<sample_point> samples;
for (int i = 0; i != N; ++i) {
double x = utilities::random_double(0, 2*utilities::pi); // x range = [0, 2pi]
double sin_x = sin(x);
double val = exp(-x / (2*utilities::pi)) * sin_x * sin_x; // function f(x)=exp(-x/2pi)*sin(x)^2
sum += val; // for integration
sample_point p{x, val};
samples.emplace_back(p); // for inv-function calculation
}
double average = sum / N; // unit-length average area
double area = 2 * utilities::pi * sum / N; // area = (2pi - 0) * avg_area
std::cout << "pdf unit-length average area: " << average << std::endl;
std::cout << "pdf total area under curve: " << area << std::endl;
std::sort(samples.begin(), samples.end(),
[](const sample_point& a, const sample_point& b)->bool{ return a.x < b.x; });
double uniform_u = 0.3; // assume U=0.3
double integral_target = uniform_u * sum; // integral until uniform_u
double accumulation = 0.0;
double result_generated_x = 0.0;
for (auto &sample: samples) {
accumulation += sample.val;
if (accumulation >= integral_target) {
result_generated_x = sample.x;
break;
}
}
std::cout << "result_generated_x: " << result_generated_x << std::endl;
return 0;
}