इन स्थितियों में, आपको यादृच्छिक संख्या जनरेटर को एक से अधिक बार आमंत्रित करने की आवश्यकता नहीं है। सभी यो
double c[k] = // the probability that X <= k (k = 0,...)
फिर एक यादृच्छिक संख्या 0 <= r < 1
उत्पन्न, और पहली पूर्णांक X
ऐसी है कि c[X] > r
ले: यू की जरूरत संचयी संभावनाओं की एक टेबल है। आप इस X
को बाइनरी खोज के साथ पा सकते हैं।
इस तालिका बनाने के लिए, हम की जरूरत अलग-अलग संभावनाओं
p[k] = lambda^k/(k! e^lambda) // // the probability that X = k
तो lambda
बड़ी है, इस बेतहाशा गलत हो जाता है, जैसा कि आप मिल गया है। लेकिन हम यहां एक चाल का उपयोग कर सकते हैं: k = floor[lambda]
के साथ सबसे बड़े मूल्य पर (या निकट) शुरू करें, और उस पल के लिए नाटक करें कि p[k]
1
के बराबर है। फिर आवर्ती संबंध
p[i+1] = (p[i]*lambda)/(i+1)
और i < k
के लिए उपयोग कर
p[i-1] = (p[i]*i)/lambda
यह सुनिश्चित करता है कि सबसे बड़ी संभावनाओं सबसे बड़ी संभव सटीक का उपयोग कर i > k
के लिए p[i]
गणना।
अब बस c[i]
, c[i+1] = c[i] + p[i+1]
का उपयोग कर की गणना बिंदु तक जहां c[i+1]
c[i]
के समान है। फिर आप इस सीमित मूल्य c[i]
द्वारा विभाजित करके सरणी को सामान्यीकृत कर सकते हैं; या आप सरणी को छोड़ सकते हैं, और यादृच्छिक संख्या 0 <= r < c[i]
का उपयोग कर सकते हैं।
देखें: http://en.wikipedia.org/wiki/Inverse_transform_sampling
IIRC, एक प्वाइजन चर एक घातीय वितरण है। इसलिए यह http://stackoverflow.com/questions/2106503/pseudorandom-number- जनरेटर-exponential- वितरण का एक सटीक डुप्लिकेट है। लेकिन अगर मैं गलत हूं, तो वहां दी गई विधि को काम करना चाहिए। – MSalters
@MSalters: Poisson वितरण अलग है - इसमें केवल पूर्णांक मान होते हैं। घातीय वितरण निरंतर है। तो वे एक जैसे नहीं हैं (हालांकि वे संबंधित हैं)। – TonyK
सही, विकिपीडिया से: "यदि किसी दिए गए समय अंतराल में आगमन की संख्या [0, टी] अर्थ = λt के साथ पोइसन वितरण का पालन करती है, तो अंतर-आगमन के समय की लंबाई घातीय वितरण का पालन करती है, जिसका अर्थ 1/λ। "। यह नीचे प्रस्तावित एल्गोरिदम के समान संरचनात्मक रूप से दोनों के बीच एक प्रभावी परिवर्तन है। – MSalters