#include <bits/stdc++.h>
using namespace std;
/*
Q1. What is the purpose of Box-Muller Transform?
Ans: It generates normally distributed random numbers from uniform random numbers.
Q2. What are the expected mean and standard deviation?
Ans: For a standard normal distribution: Mean ≈ 0, StdDev ≈ 1.
Q3. What do you observe from generated values?
Ans: With N=10000, the sample mean is very close to 0 and sample stddev close to 1, confirming normal distribution.
*/
int main() {
srand(time(0));
int N = 10000;
vector<double> values;
for (int i = 0; i < N/2; i++) {
double u1 = (double)rand() / RAND_MAX;
double u2 = (double)rand() / RAND_MAX;
double R = sqrt(-2 * log(u1));
double z1 = R * cos(2*M_PI*u2);
double z2 = R * sin(2*M_PI*u2);
values.push_back(z1);
values.push_back(z2);
}
double mean = accumulate(values.begin(), values.end(), 0.0) / values.size();
double sq_sum = 0;
for (double v : values) sq_sum += (v - mean) * (v - mean);
double stddev = sqrt(sq_sum / values.size());
cout << "Box-Muller Normal Distribution:\n";
cout << "Generated " << N << " values.\n";
cout << "Mean ≈ " << mean << ", StdDev ≈ " << stddev << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKgpRMS4gV2hhdCBpcyB0aGUgcHVycG9zZSBvZiBCb3gtTXVsbGVyIFRyYW5zZm9ybT8KQW5zOiBJdCBnZW5lcmF0ZXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIG51bWJlcnMgZnJvbSB1bmlmb3JtIHJhbmRvbSBudW1iZXJzLgoKUTIuIFdoYXQgYXJlIHRoZSBleHBlY3RlZCBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24/CkFuczogRm9yIGEgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbjogTWVhbiDiiYggMCwgU3RkRGV2IOKJiCAxLgoKUTMuIFdoYXQgZG8geW91IG9ic2VydmUgZnJvbSBnZW5lcmF0ZWQgdmFsdWVzPwpBbnM6IFdpdGggTj0xMDAwMCwgdGhlIHNhbXBsZSBtZWFuIGlzIHZlcnkgY2xvc2UgdG8gMCBhbmQgc2FtcGxlIHN0ZGRldiBjbG9zZSB0byAxLCBjb25maXJtaW5nIG5vcm1hbCBkaXN0cmlidXRpb24uCiovCgppbnQgbWFpbigpIHsKICAgIHNyYW5kKHRpbWUoMCkpOwogICAgaW50IE4gPSAxMDAwMDsKICAgIHZlY3Rvcjxkb3VibGU+IHZhbHVlczsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IE4vMjsgaSsrKSB7CiAgICAgICAgZG91YmxlIHUxID0gKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWDsKICAgICAgICBkb3VibGUgdTIgPSAoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYOwogICAgICAgIGRvdWJsZSBSID0gc3FydCgtMiAqIGxvZyh1MSkpOwogICAgICAgIGRvdWJsZSB6MSA9IFIgKiBjb3MoMipNX1BJKnUyKTsKICAgICAgICBkb3VibGUgejIgPSBSICogc2luKDIqTV9QSSp1Mik7CiAgICAgICAgdmFsdWVzLnB1c2hfYmFjayh6MSk7CiAgICAgICAgdmFsdWVzLnB1c2hfYmFjayh6Mik7CiAgICB9CgogICAgZG91YmxlIG1lYW4gPSBhY2N1bXVsYXRlKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIDAuMCkgLyB2YWx1ZXMuc2l6ZSgpOwogICAgZG91YmxlIHNxX3N1bSA9IDA7CiAgICBmb3IgKGRvdWJsZSB2IDogdmFsdWVzKSBzcV9zdW0gKz0gKHYgLSBtZWFuKSAqICh2IC0gbWVhbik7CiAgICBkb3VibGUgc3RkZGV2ID0gc3FydChzcV9zdW0gLyB2YWx1ZXMuc2l6ZSgpKTsKCiAgICBjb3V0IDw8ICJCb3gtTXVsbGVyIE5vcm1hbCBEaXN0cmlidXRpb246XG4iOwogICAgY291dCA8PCAiR2VuZXJhdGVkICIgPDwgTiA8PCAiIHZhbHVlcy5cbiI7CiAgICBjb3V0IDw8ICJNZWFuIOKJiCAiIDw8IG1lYW4gPDwgIiwgU3RkRGV2IOKJiCAiIDw8IHN0ZGRldiA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9