बॉक्स-मुलर ट्रांसफॉर्म का उपयोग करके यूनिफॉर्म डिस्ट्रीब्यूशन से नॉर्मल (गाउसियन) डिस्ट्रीब्यूशन वाले रैंडम नंबर उत्पन्न किए जा सकते हैं।
फॉर्मूला (बॉक्स-मुलर)
z = sqrt(-2 * ln(x1)) * cos(2 * π * x2)
जहां x1, x2 ∈ (0, 1] यूनिफॉर्म रैंडम वेरिएबल्स हैं।
उदाहरण
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
using namespace std;
double rand_gen() {
// (0, 1] रेंज में यूनिफॉर्म रैंडम मान
return ((double)rand() + 1.0) / ((double)RAND_MAX + 1.0);
}
double normalRandom() {
double v1 = rand_gen();
double v2 = rand_gen();
return cos(2 * M_PI * 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<> dist(40.0, 82.0); // माध्य, मानक विचलन
for (int i = 0; i < 20; i++)
std::cout << "x = " << dist(gen) << '\n';
return 0;
}
नोट
M_PIके लिए#define _USE_MATH_DEFINES(MSVC) या#include <cmath>के साथM_PIया3.14159265358979323846उपयोग करें।- आधुनिक C++
<random>लाइब्रेरी अधिक विश्वसनीय और मानक-अनुरूप है।