rand() % n
आदर्श से कम होने से संबंधित
rand() % n
गैर-समान वितरण के लिए डूइंग है। आपको कुछ निश्चित मानों की अनुपातहीन संख्या मिल जाएगी क्योंकि मानों की संख्या 20 से अधिक नहीं है
अगला, rand()
आम तौर पर एक रैखिक बधाई जनरेटर है ( कई अन्य हैं , बस यह सबसे अधिक संभावना है जिसे लागू किया गया है - और आदर्श मापदंडों से कम के साथ (मापदंडों का चयन करने के कई तरीके हैं)। इसके साथ सबसे बड़ी समस्या यह है कि अक्सर इसमें कम बिट्स (जिन्हें आप एक % 20
प्रकार की अभिव्यक्ति के साथ प्राप्त करते हैं) यादृच्छिक नहीं हैं। मैं एक याद rand()
साल पहले से जहां सबसे कम बिट से बारी-बारी से 1
करने के लिए 0
की गई प्रत्येक कॉल के साथ rand()
- यह बहुत यादृच्छिक नहीं था।
से रैंड (3) आदमी पेज:
लिनक्स सी लाइब्रेरी में रैंड () और सरंड () के संस्करण समान हैं
यादृच्छिक संख्या जनरेटर यादृच्छिक के रूप में () और srandom (), इसलिए निचले क्रम
बिट्स उच्च-क्रम बिट्स के रूप में यादृच्छिक होना चाहिए। हालाँकि, पुराने पर
रैंड () कार्यान्वयन, और विभिन्न पर वर्तमान कार्यान्वयन पर
सिस्टम, निचले क्रम के बिट्स उच्चतर की तुलना में बहुत कम यादृच्छिक होते हैं-
आदेश बिट्स। इस फ़ंक्शन का उपयोग उन अनुप्रयोगों में न करें जो होने का इरादा रखते हैं
पोर्टेबल जब अच्छा यादृच्छिकता की जरूरत है।
यह अब इतिहास में फिर से शामिल किया जा सकता है, लेकिन यह बहुत संभव है कि आप अभी भी एक खराब रैंड () कार्यान्वयन को ढेर में कहीं छिपा रहे हैं। किस मामले में, यह अभी भी काफी लागू है।
करने की बात यह है कि वास्तव में एक अच्छे रैंडम नंबर लाइब्रेरी का उपयोग करें (जो अच्छे रैंडम नंबर देता है) और फिर अपनी इच्छित सीमा के भीतर रैंडम नंबर मांगें।
कोड की एक अच्छी यादृच्छिक संख्या का उदाहरण (लिंक किए गए वीडियो में 13:00 बजे से)
#include <iostream>
#include <random>
int main() {
std::mt19937 mt(1729); // yes, this is a fixed seed
std::uniform_int_distribution<int> dist(0, 99);
for (int i = 0; i < 10000; i++) {
std::cout << dist(mt) << " ";
}
std::cout << std::endl;
}
इसकी तुलना करें:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
for (int i = 0; i < 10000; i++) {
printf("%d ", rand() % 100);
}
printf("\n");
}
इन दोनों कार्यक्रमों को चलाएं और तुलना करें कि उस आउटपुट में कितनी संख्याएँ आती हैं (या ऊपर नहीं आती हैं)।
संबंधित वीडियो: रैंड () हानिकारक माना जाता है
रैंड के कुछ ऐतिहासिक पहलू () नेथेक में बग पैदा करते हैं जिन्हें किसी को अपने स्वयं के कार्यान्वयन में देखना और विचार करना चाहिए:
नेटहैक आरएनजी समस्या
रैंड () नेटहॉक की यादृच्छिक संख्या पीढ़ी के लिए एक बहुत ही मौलिक कार्य है। जिस तरह से नेटहैक इसका इस्तेमाल करता है वह छोटी गाड़ी है या यह तर्क दिया जा सकता है कि lrand48 () भद्दे छद्म यादृच्छिक संख्या पैदा करता है। (हालांकि, lrand48 () एक परिभाषित PRNG विधि का उपयोग करते हुए एक पुस्तकालय समारोह है और इसका उपयोग करने वाले किसी भी कार्यक्रम को उस पद्धति की कमजोरियों को ध्यान में रखना चाहिए।)
बग यह है कि नेटहॉक भरोसा करता है (कभी-कभी विशेष रूप से जैसा कि आरएन (2) में होता है) lrand48 () से परिणामों के निचले बिट्स पर होता है। इस वजह से पूरे खेल में आरएनजी खराब काम करती है। उपयोगकर्ता क्रियाओं को और अधिक यादृच्छिकता, अर्थात चरित्र निर्माण और पहले स्तर के निर्माण में प्रस्तुत करने से पहले यह विशेष रूप से ध्यान देने योग्य है।
हालांकि उपरोक्त 2003 से था, फिर भी इसे ध्यान में रखा जाना चाहिए क्योंकि ऐसा नहीं हो सकता है कि आपके इच्छित खेल को चलाने वाले सभी सिस्टम एक अच्छे रैंड () फ़ंक्शन के साथ लिनक्स सिस्टम तक होंगे।
तुम सिर्फ खुद के लिए यह कर रहे हैं, तो आप परीक्षण कर सकते हैं कितना अच्छा अपने यादृच्छिक संख्या जनरेटर के द्वारा होता है कुछ कोड लिखने और साथ उत्पादन के परीक्षण के ईएनटी ।
यादृच्छिक संख्याओं के गुणों पर
'यादृच्छिक' की अन्य व्याख्याएं हैं जो बिल्कुल यादृच्छिक नहीं हैं। डेटा की एक यादृच्छिक धारा में, समान संख्या को दो बार प्राप्त करना काफी संभव है। यदि आप एक सिक्का (यादृच्छिक) फ्लिप करते हैं, तो एक पंक्ति में दो सिर प्राप्त करना काफी संभव है। या एक पासे को दो बार फेंकें और एक ही संख्या में दो बार मिलें। या रूलेट व्हील को स्पिन करना और वहां दो बार एक ही नंबर प्राप्त करना।
संख्याओं का वितरण
जब कोई गीत सूची खेल रहा होता है, तो लोग 'यादृच्छिक' की अपेक्षा करते हैं कि एक ही गीत या कलाकार को दूसरी बार बजाया नहीं जाएगा। एक पंक्ति में दो बार प्लेलिस्ट खेलने के बाद 'यादृच्छिक नहीं' (हालांकि यह यादृच्छिक है) माना जाता है । चार गानों की एक प्ले लिस्ट के लिए यह धारणा कुल आठ बार निभाई गई:
1 3 2 4 1 2 4 3
से अधिक 'यादृच्छिक' है:
1 3 3 2 1 4 4 2
गाने के 'फेरबदल' के लिए इस पर और अधिक: गाने को कैसे फेरबदल करें?
बार-बार मान पर
यदि आप मानों को दोहराना नहीं चाहते हैं, तो एक अलग दृष्टिकोण है जिसे माना जाना चाहिए। सभी संभावित मान उत्पन्न करें, और उन्हें फेरबदल करें।
यदि आप कॉल कर रहे हैं rand()
(या किसी अन्य यादृच्छिक संख्या जनरेटर), तो आप इसे प्रतिस्थापन के साथ बुला रहे हैं। आप हमेशा एक ही नंबर दो बार प्राप्त कर सकते हैं। एक विकल्प यह है कि जब तक आप अपनी आवश्यकताओं को पूरा न कर लें, तब तक मूल्यों को बार-बार टॉस करें। मैं इंगित करता हूं कि यह एक गैर-नियतात्मक रनटाइम है और यह संभव है कि आप खुद को ऐसी स्थिति में पा सकते हैं जहां एक अनंत लूप है जब तक आप एक अधिक जटिल बैक ट्रेसिंग करना शुरू नहीं करते हैं।
सूची और चुनें
एक अन्य विकल्प सभी संभावित वैध राज्यों की सूची तैयार करना है और फिर उस सूची से एक यादृच्छिक तत्व का चयन करना है। कमरे में सभी खाली स्पॉट (जो कुछ नियमों को पूरा करते हैं) ढूंढें और फिर उस सूची से एक यादृच्छिक चुनें। और फिर इसे फिर से करें और तब तक करें जब तक आप काम न करें।
मिश्रण
अन्य दृष्टिकोण यह है कि यह ताश के पत्तों की तरह है। कमरे में सभी खाली स्थानों के साथ बाहर शुरू करें और फिर खाली स्थान के लिए पूछते हुए प्रत्येक नियम / प्रक्रिया को खाली स्थानों से निपटते हुए उन्हें असाइन करना शुरू करें। आप तब करते हैं जब आप कार्ड से बाहर निकलते हैं या चीजें उनके लिए पूछना बंद कर देती हैं।