2016-05-24 7 views
5

कैसे np.random.randint() साथ के रूप में एक यादृच्छिक पूर्णांक उत्पन्न करने के लिए के एक यादृच्छिक सामान्य वितरण उत्पन्न करने के लिए है, लेकिन 0. चारों ओर एक सामान्य वितरण के साथकैसे पूर्णांकों

एक असतत समान वितरण np.random.normal(0, 0.1, 1) रिटर्न के साथ np.random.randint(-10, 10) रिटर्न पूर्णांकों एक सामान्य वितरण के साथ तैरता

जो मैं चाहता हूं वह दोनों कार्यों के बीच संयोजन का एक प्रकार है।

+10

सामान्य वितरण परिभाषा के द्वारा निरंतर है, इसलिए इस सवाल का जवाब इस पर निर्भर करता है कि आप इसे कैसे विभाजित करना चाहते हैं। एक संभावित समाधान 'np.random.normal' से नमूना करना है और परिणाम को पूर्णांक में गोल करना है। –

उत्तर

14

एक अन्य संभावित एक असतत वितरण कि तरह लग रहा है सामान्य वितरण एक बहुपद वितरण जहां से आकर्षित करने के लिए है पाने के लिए जिस तरह से लग रहा है संभावनाओं को एक सामान्य वितरण से गणना की जाती है।

import scipy.stats as ss 
import numpy as np 
import matplotlib.pyplot as plt 

x = np.arange(-10, 11) 
xU, xL = x + 0.5, x - 0.5 
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3) 
prob = prob/prob.sum() #normalize the probabilities so their sum is 1 
nums = np.random.choice(x, size = 10000, p = prob) 
plt.hist(nums, bins = len(x)) 

यहाँ, np.random.choice [-10, 10] से एक पूर्णांक चुनता है। तत्व का चयन करने की संभावना, 0 कहें, पी द्वारा गणना की जाती है (-0.5 < x < 0.5) जहां x सामान्य शून्य और मानक विचलन के साथ एक सामान्य यादृच्छिक चर है 3. मैं std। देव। 3 के रूप में, क्योंकि इस तरह से पी (-10 < एक्स < 10) है लगभग 1.

परिणाम इस प्रकार है:

enter image description here

+0

आपने 'xL' और' xU' में 0.5 को क्यों जोड़ा और घटाया? –

+2

एक सतत वितरण के लिए, पी (एक्स = 0) = 0 (यह किसी अन्य नंबर के लिए सच है)। Probabiltiy अंतराल के लिए परिभाषित किया गया है। यहां, 0 (और अन्य पूर्णांकों) की संभावना को जोड़ने के लिए मैंने अंतराल (-0.5, 0.5) का उपयोग किया था, यह मूल रूप से था क्योंकि सवाल पूर्णांक के लिए पूछा गया था। 1 के लिए, यह (0.5, 1.5) है। – ayhan

+0

आपने 'ss.norm.pdf क्यों नहीं लिया (x, scale = 3)'? –

4

Truncated Normal Distribution से समान वितरण उत्पन्न करना संभव हो सकता है जो पूर्णांक तक पूर्ण होता है। Scipy's truncnorm() के साथ एक उदाहरण यहां दिया गया है।

import numpy as np 
from scipy.stats import truncnorm 
import matplotlib.pyplot as plt 

scale = 3. 
range = 10 
size = 100000 

X = truncnorm(a=-range/scale, b=+range/scale, scale=scale).rvs(size=size) 
X = X.round().astype(int) 

चलो देखते हैं क्या यह

तरह
bins = 2 * range + 1 
plt.hist(X, bins) 

enter image description here

+0

मैं @ayhan और Bakkal दोनों से प्रतिक्रियाओं की सराहना करता हूं। कृपया, मैं केवल यह अपने ज्ञान के लिए पूछता हूं; मैं या तो जवाब का अपमान नहीं करना चाहता हूं। बस साजिश को देखते हुए, बक्कल अधिक सममित है। वे दोनों पर्याप्त प्रतीत होते हैं और कोड से समान रूप से मान्य लगते हैं। लेकिन मेरी समझ कमजोर है। क्या कोई व्यावहारिक रूप से बेहतर तरीका है? –

+1

@RobertLugg अपेक्षाकृत उच्च समरूपता नमूना आकार बड़ा होने के कारण हो सकती है। उस ने कहा, मुझे लगता है कि इस जवाब में कोड सरल है। – bakkal

संबंधित मुद्दे