खोज…


टिप्पणियों

C ++ में रैंडम नंबर जेनरेशन <random> हैडर द्वारा प्रदान किया जाता है। यह हेडर यादृच्छिक उपकरणों, छद्म यादृच्छिक जनरेटर और वितरण को परिभाषित करता है।

यादृच्छिक डिवाइस ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए यादृच्छिक संख्याओं को वापस करते हैं। उन्हें या तो छद्म यादृच्छिक जनरेटरों के आरंभ के लिए या सीधे क्रिप्टोग्राफ़िक उद्देश्यों के लिए उपयोग किया जाना चाहिए।

छद्म यादृच्छिक जनरेटर अपने प्रारंभिक बीज के आधार पर पूर्णांक-यादृच्छिक संख्याओं को वापस करते हैं। छद्म यादृच्छिक संख्या सीमा आम तौर पर एक अहस्ताक्षरित प्रकार के सभी मूल्यों को फैलाती है। मानक पुस्तकालय में सभी छद्म यादृच्छिक जनरेटर सभी प्लेटफार्मों के लिए एक ही प्रारंभिक बीज के लिए एक ही संख्या वापस कर देंगे।

वितरण छद्म यादृच्छिक जनरेटर या यादृच्छिक उपकरणों से यादृच्छिक संख्या का उपभोग करते हैं और आवश्यक वितरण के साथ यादृच्छिक संख्या का उत्पादन करते हैं। वितरण प्लेटफ़ॉर्म-स्वतंत्र नहीं हैं और एक ही जनरेटर के लिए अलग-अलग प्लेटफ़ॉर्म पर एक ही प्रारंभिक बीजों के साथ अलग-अलग संख्याओं का उत्पादन कर सकते हैं।

सच यादृच्छिक मूल्य जनरेटर

क्रिप्टोग्राफी std::random_device लिए इस्तेमाल किया जा सकता है कि असली यादृच्छिक मूल्यों को उत्पन्न करने के लिए जनरेटर के रूप में इस्तेमाल किया जाना है।

#include <iostream>
#include <random>

int main()
{
   std::random_device crypto_random_generator;
   std::uniform_int_distribution<int> int_distribution(0,9);
   
   int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
   
   for(int i = 0; i < 10000; i++) {
       int result = int_distribution(crypto_random_generator);
       actual_distribution[result]++;
   }

   for(int i = 0; i < 10; i++) {
       std::cout << actual_distribution[i] << " ";
   }
   
   return 0;
}

std::random_device का उपयोग उसी तरह किया जाता है जैसे कि एक छद्म यादृच्छिक मान जनरेटर का उपयोग किया जाता है।

हालाँकि std::random_device को कार्यान्वयन-परिभाषित छद्म-यादृच्छिक संख्या इंजन के संदर्भ में लागू किया जा सकता है यदि कार्यान्वयन के लिए एक गैर-निर्धारक स्रोत (जैसे एक हार्डवेयर डिवाइस) उपलब्ध नहीं है।

इस तरह के कार्यान्वयन का पता लगाना entropy सदस्य फ़ंक्शन के माध्यम से संभव होना चाहिए (जो कि जनरेटर पूरी तरह से नियतात्मक होने पर शून्य वापस लौटता है), लेकिन कई लोकप्रिय पुस्तकालय (जीसीसी के libstdc ++ और LLVM के libc ++ दोनों) हमेशा शून्य होते हैं, भले ही वे उच्च गुणवत्ता वाले बाहरी यादृच्छिकता का उपयोग कर रहे हों ।

एक छद्म यादृच्छिक संख्या उत्पन्न करना

एक छद्म यादृच्छिक संख्या जनरेटर मान उत्पन्न करता है जिसे पहले उत्पन्न मानों के आधार पर अनुमान लगाया जा सकता है। दूसरे शब्दों में: यह नियतात्मक है। एक छद्म यादृच्छिक संख्या जनरेटर का उपयोग उन स्थितियों में न करें जहां एक सच्चे यादृच्छिक संख्या की आवश्यकता होती है।

#include <iostream>
#include <random>

int main()
{
   std::default_random_engine pseudo_random_generator;
   std::uniform_int_distribution<int> int_distribution(0, 9);
   
   int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
   
   for(int i = 0; i < 10000; i++) {
       int result = int_distribution(pseudo_random_generator);
       actual_distribution[result]++;
   }

   for(int i = 0; i <= 9; i++) {
       std::cout << actual_distribution[i] << " ";
   }
   
   return 0;
}

यह कोड एक यादृच्छिक संख्या जनरेटर बनाता है, और एक वितरण जो समान संभावना वाले रेंज में पूर्णांक उत्पन्न करता है [0,9]। यह तब गिना जाता है कि प्रत्येक परिणाम कितनी बार उत्पन्न हुआ था।

std::uniform_int_distribution<T> का टेम्पलेट पैरामीटर पूर्णांक के प्रकार को निर्दिष्ट करता है जिसे उत्पन्न किया जाना चाहिए। फ़्लोट या डबल्स उत्पन्न करने के लिए std::uniform_real_distribution<T> का उपयोग करें।

कई वितरणों के लिए जनरेटर का उपयोग करना

यादृच्छिक वितरण जनरेटर (और चाहिए) का उपयोग कई वितरणों के लिए किया जा सकता है।

#include <iostream>
#include <random>

int main()
{
   std::default_random_engine pseudo_random_generator;
   std::uniform_int_distribution<int> int_distribution(0, 9);
   std::uniform_real_distribution<float> float_distribution(0.0, 1.0);
   std::discrete_distribution<int> rigged_dice({1,1,1,1,1,100});
   
   std::cout << int_distribution(pseudo_random_generator) << std::endl;
   std::cout << float_distribution(pseudo_random_generator) << std::endl;
   std::cout << (rigged_dice(pseudo_random_generator) + 1) << std::endl;
   
   return 0;
}

इस उदाहरण में, केवल एक जनरेटर परिभाषित किया गया है। इसे बाद में तीन अलग-अलग वितरणों में एक यादृच्छिक मान उत्पन्न करने के लिए उपयोग किया जाता है। rigged_dice वितरण 0 और 5 के बीच एक मूल्य उत्पन्न होगा, लेकिन लगभग हमेशा एक उत्पन्न करता है 5 , क्योंकि उत्पन्न करने के लिए मौका एक 5 है 100 / 105



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow