क्या आप हमेशा शब्दकोश में मूल्यों की कुल संख्या जानते हैं? कुंजी की अपनी सूची से अधिक
- दोहराएं: यदि हां, तो इस निम्नलिखित एल्गोरिथ्म, जो इस्तेमाल किया जा सकता के साथ क्या करने के लिए आसान है जब भी आप एक आदेश दिया सूची से कुछ मदों की एक संभाव्य चयन बनाना चाहते हो सकता है।
- 0 और 1 (उर्फ "पासा रोल") के बीच समान रूप से वितरित यादृच्छिक मान उत्पन्न करें।
- मानते हैं कि इस कुंजी के साथ जुड़े एन_वीएएलएस मान हैं और पूरे शब्दकोश में TOTAL_VALS कुल मान हैं, इस कुंजी को संभाव्यता N_VALS/N_REMAINING के साथ स्वीकार करें, जहां N_REMAINING सूची में छोड़ी गई वस्तुओं की संख्या है।
इस एल्गोरिदम का कोई भी नया सूचियां उत्पन्न करने का लाभ नहीं है, जो महत्वपूर्ण है यदि आपका शब्दकोश बड़ा है। आपका प्रोग्राम केवल कुल की गणना करने के लिए के कुंजी पर लूप के लिए भुगतान कर रहा है, चाबियों पर एक और लूप जो औसत अंत में आधा रास्ते पर होगा, और 0 और 1 के बीच यादृच्छिक संख्या उत्पन्न करने के लिए जो कुछ भी खर्च होता है, वह इस तरह की यादृच्छिक संख्या उत्पन्न करना है प्रोग्रामिंग में एक बहुत ही आम अनुप्रयोग है, इसलिए अधिकांश भाषाओं में ऐसे फ़ंक्शन का तेज़ कार्यान्वयन होता है। पाइथन में random number generatorMersenne Twister algorithm का सी कार्यान्वयन, जो बहुत तेज़ होना चाहिए। इसके अतिरिक्त, दस्तावेज़ीकरण का दावा है कि यह कार्यान्वयन थ्रेड-सुरक्षित है।
यहां कोड है।
{'a': 49801, 'c': 33548, 'b': 16650}
:
#!/usr/bin/python
import random
def select_weighted(d):
# calculate total
total = 0
for key in d:
total = total + len(d[key])
accept_prob = float(1.0/total)
# pick a weighted value from d
n_seen = 0
for key in d:
current_key = key
for val in d[key]:
dice_roll = random.random()
accept_prob = float(1.0/(total - n_seen))
n_seen = n_seen + 1
if dice_roll <= accept_prob:
return current_key
dict = {
'a': [1, 3, 2],
'b': [6],
'c': [0, 0]
}
counts = {}
for key in dict:
counts[key] = 0
for s in range(1,100000):
k = select_weighted(dict)
counts[k] = counts[k] + 1
print counts
इस 100 बार चलाने के बाद, मैं चयन कुंजी कई बार इस नंबर मिल: मुझे यकीन है कि आप इसे साफ आप अधिक pythonic सुविधाओं का उपयोग करना चाहते हैं तो कर सकते हैं
{'a': 0.5, 'c': 0.33333333333333331, 'b': 0.16666666666666666}
संपादित करें:: उन काफी की अपनी उम्मीद मूल्यों के करीब हैं मीलों अपने मूल कार्यान्वयन, जो बाद से सही किया गया है में एक गंभीर त्रुटि बताया। उसके लिए माफ़ करना!
स्रोत
2009-06-29 01:08:17
[वेटेड विकल्प कम और सरल] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/10803135/weighted-choice-short-and-simple) –