फ़ंक्शन मानता है कि rand()
समान रूप से वितरित किया गया है; चाहे वह मान्य धारणा है या नहीं rand()
के कार्यान्वयन पर निर्भर करता है।
एक समान rand()
को देखते हुए, हम rand()%n
की गणना करके [0,n)
श्रेणी में यादृच्छिक संख्या प्राप्त कर सकते हैं। हालांकि, सामान्य रूप से, यह काफी समान नहीं होगा। उदाहरण के लिए, मान लीजिए n
3 और RAND_MAX
7:
rand() 0 1 2 3 4 5 6 7
rand() % n 0 1 2 0 1 2 0 1
हम देख सकते हैं कि 0 और 1 3/8 की संभावना के साथ आते हैं, जबकि 2 केवल 2/8 की एक संभावना के साथ आता है: वितरण एक समान नहीं है।
आपका कोड rand()
के किसी भी मूल्य को n
के सबसे बड़े एकाधिक के बराबर या बराबर करता है जो इसे उत्पन्न कर सकता है।
rand() 0 1 2 3 4 5 6 7
rand() % n 0 1 2 0 1 2 X X
तो 0,1 और 2 सभी 1/3 की संभावना के साथ आते हैं, जब तक कि हम इतनी बदकिस्मत कि पाश कभी नहीं समाप्त हो जाता है नहीं कर रहे हैं: अब प्रत्येक मान एक समान आशंका होती है।
अपने अद्यतन के बारे में:
मुझे लगता है कि एक साधारण शीर्ष = RAND_MAX/n * n करना होगा।
यदि RAND_MAX
एक विशेष बाध्य (वास्तविक अधिकतम से अधिक एक) थे, तो यह सही होगा।चूंकि यह एक समावेशी बाध्य है, इसलिए हमें अनन्य बाध्य करने के लिए एक जोड़ना होगा; और के बाद से निम्नलिखित तर्क एक समावेशी बाध्य खिलाफ >
के साथ तुलना करें, तो एक बार फिर गणना के बाद घटाना:
int top = ((RAND_MAX + 1)/n) * n - 1;
हालांकि, अगर RAND_MAX
INT_MAX
के बराबर थे, तो गणना अतिप्रवाह होगा, कि से बचने के लिए, गणना की शुरुआत में n
घटाना, और अंत में फिर से जोड़ें:
int top = (((RAND_MAX - n) + 1)/n) * n - 1 + n;
आपको ऐसा क्यों लगता है कि यह एक समान वितरण उत्पन्न करता है? – Alnitak