নরমাল (গাউসিয়ান) ডিস্ট্রিবিউশন অনুসারে র্যান্ডম নম্বর জেনারেট করার জন্য বক্স-মুলার ট্রান্সফরম (Box-Muller Transform) ব্যবহার করা হয়। এই পদ্ধতিতে দুটি ইউনিফর্ম র্যান্ডম নম্বর থেকে একটি নরমাল র্যান্ডম নম্বর তৈরি করা হয়।
ফর্মুলা
z = √(-2 ln x₁) × cos(2π x₂)
এখানে x₁ এবং x₂ হলো ০ থেকে ১ এর মধ্যে ইউনিফর্ম ডিস্ট্রিবিউশন 따르는 র্যান্ডম নম্বর।
উদাহরণ (C++)
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
using namespace std;
double rand_gen() {
// 0.0 থেকে 1.0 পর্যন্ত ইউনিফর্ম র্যান্ডম
return ((double)rand() + 1.0) / ((double)RAND_MAX + 1.0);
}
double normalRandom() {
double v1 = rand_gen();
double v2 = rand_gen();
return cos(2 * 3.141592653589793 * v2) * sqrt(-2.0 * log(v1));
}
int main() {
srand(time(0)); // সিড সেট
double sigma = 82.0; // স্ট্যান্ডার্ড ডেভিয়েশন
double mu = 40.0; // মিন (মध्यমান)
for (int i = 0; i < 20; i++) {
double x = normalRandom() * sigma + mu;
cout << "x = " << x << endl;
}
return 0;
}
আউটপুট (নমুনা)
x = 1.91628
x = 57.0448
x = 51.4348
x = 53.5612
x = -83.8511
x = -28.9197
x = -76.0576
x = 62.1435
x = 23.9
x = -87.0663
x = 50.6942
x = 94.1685
x = -88.1597
x = 168.502
x = 40.7563
x = 90.1091
x = 16.9218
x = -36.9178
x = 135.969
x = 56.8888
আধুনিক C++ (C++11 এবং পরবর্তী) — ভালো পদ্ধতি
#include <random>
#include <iostream>
int main() {
std::random_device rd;
std::mt19937 gen(rd());
std::normal_distribution<> d(40.0, 82.0); // mean=40, stddev=82
for (int i = 0; i < 20; i++)
std::cout << "x = " << d(gen) << '\n';
return 0;
}
সুপারিশ: নতুন কোডে <random> হেডার এবং std::normal_distribution ব্যবহার করুন — এটি আরও সঠিক, দ্রুত এবং স্ট্যান্ডার্ড-কম্প্লায়েন্ট।