บทความนี้แสดงวิธีสร้างเลขสุ่มที่กระจายตัวแบบปกติ (Normal Distribution) โดยใช้สูตร Box-Muller Transform:
z = √(-2 ln x₁) cos(2π x₂)
โดย x₁ และ x₂ เป็นค่าสุ่มแบบ Uniform Distribution
ตัวอย่าง
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
using namespace std;
double rand_gen() {
return ((double)(rand()) + 1.) / ((double)(RAND_MAX) + 1.);
}
double normalRandom() {
double v1 = rand_gen();
double v2 = rand_gen();
return cos(2 * 3.14 * v2) * sqrt(-2. * log(v1));
}
int main() {
double sigma = 82.0;
double Mi = 40.0;
srand(time(0));
for (int i = 0; i < 20; i++) {
double x = normalRandom() * sigma + Mi;
cout << " x = " << x << endl;
}
return 0;
}
ผลลัพธ์ (ตัวอย่าง)
x = 1.91628 x = 57.0448 x = 51.4348 ... (ค่าต่างๆ ตามการกระจายแบบปกติ) ...