C++11 <random> लाइब्रेरी
C++11 में, हमें रैंडम नंबर जनरेट करने के लिए रैंडम लाइब्रेरी मिलती है। यहां हमने random_device का उपयोग एक बार रैंडम नंबर जेनरेटर ऑब्जेक्ट mt (Mersenne Twister) को सीड करने के लिए किया है। यह random_device mt19937 से धीमा है, लेकिन हमें इसे सीड करने की आवश्यकता नहीं है। यह ऑपरेटिंग सिस्टम से रैंडम डेटा का अनुरोध करता है।
उदाहरण: 20.0 से 22.0 के बीच यूनिफॉर्म रियल नंबर्स
#include <random>
#include <iostream>
using namespace std;
int main() {
// नॉन-डिटरमिनिस्टिक सीड के लिए रैंडम डिवाइस
random_device rd;
// मेर्सेन ट्विस्टर 19937 इंजन (32-बिट)
mt19937 mt(rd());
// [20.0, 22.0] रेंज में यूनिफॉर्म रियल वितरण
uniform_real_distribution<double> dist(20.0, 22.0);
// 20 रैंडम नंबर्स जनरेट करें
for (int i = 0; i < 20; ++i)
cout << dist(mt) << endl;
return 0;
}
आउटपुट (नमूना)
21.5311 21.7195 21.0961 21.9679 21.197 21.2989 20.6333 20.441 20.7124 20.2654 21.1877 20.4824 20.0575 20.9432 21.222 21.162 21.1029 20.2253 21.5669 20.3357
घटक व्याख्या
| घटक | उद्देश्य |
|---|---|
random_device | नॉन-डिटरमिनिस्टिक एन्ट्रॉपी सोर्स (हार्डवेयर RNG यदि उपलब्ध) |
mt19937 | मेर्सेन ट्विस्टर इंजन (तेज, उच्च गुणवत्ता, 2^19937-1 पीरियड) |
uniform_real_distribution<double> | दिए गए रेंज में यूनिफॉर्मली वितरित फ्लोटिंग-पॉइंट मान |
अन्य उपयोगी इंजन्स
// 64-बिट मेर्सेन ट्विस्टर mt19937_64 mt64(rd()); // तेज लेकिन कम गुणवत्ता (एम्बेडेड सिस्टम्स के लिए) minstd_rand0 engine(rd()); // लीनियर कांग्रुएंशल minstd_rand engine(rd()); // बेहतर LCG // क्रिप्टोग्राफिक रूप से सुरक्षित (धीमा) random_device rd; // सीधे उपयोग करें या सीड के लिए
सामान्य वितरण
// इंटीजर रेंज [min, max] (इन्क्लूसिव) uniform_int_distribution<int> dice(1, 6); // डाइस रोल // सामान्य वितरण (मीन, स्टैंडर्ड डेविएशन) normal_distribution<double> nd(0.0, 1.0); // स्टैंडर्ड नॉर्मल // बर्नौली (ट्रू/फॉल्स) bernoulli_distribution coin(0.5); // फेयर कॉइन // पॉइसन poisson_distribution<int> poisson(4.0); // मीन = 4
बेस्ट प्रैक्टिसेज
- इंजन को रीयूज़ करें: प्रत्येक कॉल पर नया इंजन न बनाएं
- थ्रेड सेफ्टी:
random_deviceथ्रेड-सेफ है; इंजन्स नहीं हैं - प्रति थ्रेड एक इंजन या म्यूटेक्स का उपयोग करें - सीडिंग:
seed_seqका उपयोग करके एन्ट्रॉपी के कई स्रोतों से उचित सीडिंग करें - डिटरमिनिस्टिक टेस्टिंग: ज्ञात सीड के साथ इंजन का उपयोग करके पुनरुत्पादन योग्य परिणामों के लिए
उचित सीडिंग उदाहरण
random_device rd;
seed_seq seq{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()};
mt19937 mt(seq); // बेहतर एन्ट्रॉपी