सी ++ 11 std::random_device
प्रदान करता है ताकि स्रोत उपलब्ध होने पर गैर-निर्धारक यादृच्छिक संख्या प्रदान किया जा सके। यह सुनिश्चित करने के लिए कि यह अच्छा है, आपको अपने कार्यान्वयन की जांच करनी होगी। libC++ डिफ़ॉल्ट रूप से/dev/urandom का उपयोग करता है। libstdC++ भी करता है यदि मैक्रो _GLIBCXX_USE_RANDOM_TR1
परिभाषित किया गया है। दुर्भाग्य से विजुअल स्टूडियो का कार्यान्वयन गैर-निर्धारिती नहीं है। संपादित करें: वीएस2012 के रूप में उनके कार्यान्वयन विंडोज की क्रिप्टोग्राफी सेवाओं का उपयोग करता है।
यदि std::random_device
यादृच्छिकता के एक गैर-निर्धारिती स्रोत तक पहुंच प्रदान करता है (आमतौर पर/dev/urandom एक क्रिप्टोग्राफिक पीआरएनजी का उपयोग करता है) तो यह स्वतंत्र बीज पैदा करने के लिए पर्याप्त होना चाहिए।
#include <random>
int main() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
}
बजाय एक बीज के रूप में एक भी मूल्य का उपयोग कर के, कुछ इंजन और अधिक बीज डेटा के साथ बेहतर कर सकता है। एक बीज अनुक्रम मानक द्वारा प्रदान किया गया विकल्प है। इंजन को बीज अनुक्रमों के साथ बीजित किया जा सकता है, जो कि आप किसी भी मात्रा में डेटा के साथ लोड होते हैं और जो उस पर आधारित बीज डेटा उत्पन्न करता है।
std::random_device r;
std::vector<std::mt19937> engines;
int engines = 50;
for (int i = 0; i < engines; ++i) {
std::seed_seq s{r(), r(), r(), r(), r(), r(), r(), r()};
engines.emplace_back(s);
}
आठ 32-बिट मूल्यों, 256 बिट, के लिए पर्याप्त है, लेकिन अगर आप वास्तव में चाहते हैं आप और अधिक का उपयोग करें। प्रत्येक मानक इंजन दस्तावेज करता है कि यह बीज अनुक्रम से कितना डेटा उपयोग करता है।
उदाहरण के लिए, प्रत्येक mt19937 इंजन बीज अनुक्रम से mt19937::state_size
(624) 32-बिट मान पुनर्प्राप्त करेगा।बीज अनुक्रम से प्राप्त बीज इनपुट डेटा के समान नहीं हैं, लेकिन वे उस डेटा पर आधारित हैं, इसलिए हम अनुक्रम में उस बहुत यादृच्छिक डेटा का उपयोग कर सकते हैं।
std::random_device r;
std::vector<std::uint_least32_t> data;
std::generate_n(back_inserter(data), 624, std::ref(r));
std::seed_seq seed(begin(data), end(data));
std::mt19937 engine(seed); // 'fully' seeded mt19937
मुझे लगता है कि एकल cored वास्तुकला पर संख्या छद्म यादृच्छिक होगा, आप 1,2,3,4,5,6,7,8 की तरह नंबर जेनरेट होता है और सीपीयू के माध्यम से क्रमिक रूप से जा रहा प्रक्रियाओं होगा बस क्या ले लिया अगला और यह 'रैंड() की तरह कार्य करेगा; रैंड (;) वापसी रैंड(); ' – Vyktor