इनमें से कोई भी उत्तर विशेष रूप से स्पष्ट या सरल नहीं है।
यहां एक स्पष्ट, सरल विधि है जो काम करने की गारंटी है।
accumulate_normalize_probabilities एक डिक्शनरी लेती है p
जो प्रतीकों को संभावनाओं या फ्रिक्वेंसी पर मैप करती है । यह ट्यूपल्स की प्रयोग करने योग्य सूची का चयन करता है जिसमें से चयन करना है।
def accumulate_normalize_values(p):
pi = p.items() if isinstance(p,dict) else p
accum_pi = []
accum = 0
for i in pi:
accum_pi.append((i[0],i[1]+accum))
accum += i[1]
if accum == 0:
raise Exception( "You are about to explode the universe. Continue ? Y/N " )
normed_a = []
for a in accum_pi:
normed_a.append((a[0],a[1]*1.0/accum))
return normed_a
पैदावार:
>>> accumulate_normalize_values( { 'a': 100, 'b' : 300, 'c' : 400, 'd' : 200 } )
[('a', 0.1), ('c', 0.5), ('b', 0.8), ('d', 1.0)]
यह काम क्यों करता है
संचय कदम (पहले प्रतीक के मामले में या 0) ही है और पिछले प्रतीकों संभावना या आवृत्ति के बीच एक अंतराल में प्रत्येक प्रतीक बदल जाता है। इन अंतरालों को (और इस प्रकार प्रदान किए गए वितरण को नमूना करने के लिए) का उपयोग केवल सूची के माध्यम से सूची में कदम रखकर किया जा सकता है जब तक कि अंतराल में यादृच्छिक संख्या 0.0 -> 1.0 (पहले से तैयार) वर्तमान प्रतीक के अंतराल अंत-बिंदु के बराबर या उससे कम नहीं हो।
मानकीकरण कुछ मूल्य के लिए सुनिश्चित सब कुछ रकम बनाने के लिए जरूरत से हमें मुक्त करता है। सामान्यीकरण के बाद प्रायिकताओं के "वेक्टर" 1.0 तक डूब जाते हैं।
कोड के बाकी चयन और वितरण से एक मनमाने ढंग से लंबे नमूना पैदा करने के लिए नीचे है:
def select(symbol_intervals,random):
print symbol_intervals,random
i = 0
while random > symbol_intervals[i][1]:
i += 1
if i >= len(symbol_intervals):
raise Exception( "What did you DO to that poor list?" )
return symbol_intervals[i][0]
def gen_random(alphabet,length,probabilities=None):
from random import random
from itertools import repeat
if probabilities is None:
probabilities = dict(zip(alphabet,repeat(1.0)))
elif len(probabilities) > 0 and isinstance(probabilities[0],(int,long,float)):
probabilities = dict(zip(alphabet,probabilities)) #ordered
usable_probabilities = accumulate_normalize_values(probabilities)
gen = []
while len(gen) < length:
gen.append(select(usable_probabilities,random()))
return gen
उपयोग:
>>> gen_random (['a','b','c','d'],10,[100,300,400,200])
['d', 'b', 'b', 'a', 'c', 'c', 'b', 'c', 'c', 'c'] #<--- some of the time
random.choice()
? आप उचित सूची के साथ मास्टर सूची बनाते हैं और एक को चुनते हैं। यह एक डुप्लिकेट प्रश्न है, निश्चित रूप से।