यहां एक मेटा-चाल है जो इन समस्याओं में से कई के लिए आसान है: पूर्वाग्रह तब पेश किया जाता है जब हम कुछ फैशन में अलग-अलग शब्दों का इलाज करते हैं, इसलिए यदि हम उन्हें प्रत्येक चरण में सभी का इलाज करते हैं और केवल संचालन करते हैं सेट करें, हम परेशानी से बाहर रहेंगे।
हमें कम से कम एक बार (स्पष्ट रूप से!) रैंड 5() को कॉल करना होगा, लेकिन अगर हम उस बुरी चीजों पर शाखा करते हैं तो हम चतुर नहीं होते हैं। तो बजाय 7 संभावनाओं से प्रत्येक के लिए एक बार इसे कहते हैं: जाहिर है
In [126]: import random
In [127]: def r5():
.....: return random.randint(1, 5)
.....:
In [128]: [r5() for i in range(7)]
Out[128]: [3, 1, 3, 4, 1, 1, 2]
इन शर्तों में से प्रत्येक के लिए समान रूप से इन नंबरों में से किसी होने की संभावना थी .. लेकिन उनमें से केवल एक, 2 हुआ तो हमारे शासन करता है, तो "जो भी शब्द रैंड 5() 2 के लिए 2 देता है" का चयन किया गया था, तो यह काम करता। या 4, या जो भी हो, और अगर हम बस इतना लंबा हो जाएंगे कि ऐसा होगा। तो काम करने वाली किसी चीज़ के साथ आने का बहुत सारे तरीके हैं।
import random, collections
def r5():
return random.randint(1, 5)
def r7():
left = range(1, 8)
while True:
if len(left) == 1:
return left[0]
rs = [r5() for n in left]
m = max(rs)
how_many_at_max = rs.count(m)
if how_many_at_max == len(rs):
# all the same: try again
continue
elif how_many_at_max == 1:
# hooray!
return left[rs.index(m)]
# keep only the non-maximals
left = [l for l,r in zip(left, rs) if r != m]
जो
In [189]: collections.Counter(r7() for _ in xrange(10**6))
Out[189]: Counter({7: 143570, 5: 143206, 4: 142827, 2: 142673, 6: 142604, 1: 142573, 3: 142547})
अतिरिक्त नोट देता है:: - यहाँ (स्यूडोकोड में इस भयानक अजगर है) एक ही रास्ता है सामान्य रूप में, rand5() संक्षेप काम नहीं करेगा। जैसा कि हम rand5() पर योग करते हैं, हम समान वितरण से विचलन करना शुरू कर देंगे, और सामान्य वितरण के करीब आना शुरू कर देंगे। –
http://stackoverflow.com/questions/10464360/use-rand5-to-generate-rand7-with-the-same-probability – Mathias
@Mathias, नहीं, यह एक ही प्रश्न नहीं है, एक के लिए डुप्लिकेट की तरह दिखता है आप लिंक सी # – unkulunkulu