2009-04-15 14 views
10

जो मैं समझता हूं, मानक जनरेटर सामान्य वितरण के लिए है। मैं सामान्य, वर्दी और प्वासों वितरण के अनुसार यादृच्छिक संख्या उत्पन्न करने के लिए है, लेकिन मैं पिछले 2.पोइसन और वर्दी वितरण के लिए जावा जनरेटर?

मैं उन्हें 0 की सीमा में उत्पन्न करने के लिए है के लिए एक वर्ग को खोजने के लिए प्रतीत नहीं कर सकते हैं - 999999.

उत्तर

5

असल में, standard generator समान वितरण के लिए है। किसी भी भाषा/लाइब्रेरी में मूल यादृच्छिक संख्या जनरेटर हमेशा (सभी मामलों में मुझे पता है) समान वितरण का उपयोग करेगा क्योंकि यह सभी लोकप्रिय छद्म यादृच्छिक संख्या जेनरेटर एल्गोरिदम से बाहर आता है - मूल रूप से, वर्दी यादृच्छिक संख्या सबसे आसान होती है।

मैं देख रहा हूँ एडी पहले से ही अन्य वितरण तो मैं इस के बाकी लेखन को छोड़ देंगे के लिए एक कड़ी के लिए आप इशारा किया ...

+0

दरअसल, ऐसा लगता है कि लिंक सामान्य भिन्नताओं को बनाने के लिए "अगली गाऊशियन" विधि को भी इंगित करता है। – gnovice

4

मुझे तथ्य यह है कि इस में से कोई भी सही मायने में यादृच्छिक है, मैं से यह सब प्रस्तावना करते हैं छद्म यादृच्छिक संख्या जेनरेटर के बारे में बात कर रहा हूँ।

मुझे यह भी कहना है कि मुझे कभी भी उत्पादन गुणवत्ता कोड के लिए ऐसा नहीं करना पड़ा है। हालांकि, मैंने पाइथन में एक एचडब्ल्यू असाइनमेंट के लिए ऐसा किया है। मैं Poisson यादृच्छिक चर अनुकरण किया।

  1. एक प्वाइजन यादृच्छिक चर घातीय यादृच्छिक चर का एक योग है:

    तरीका है कि मैंने किया निम्न तथ्यों का इस्तेमाल किया।

  2. हम घातीय यादृच्छिक चर उत्पन्न करने के लिए उलटा परिवर्तन विधि का उपयोग कर सकते हैं। http://en.wikipedia.org/wiki/Inverse_transform_sampling

विशेष रूप से, आप इस तथ्य का उपयोग कर सकते हैं कि: यदि एक्स , ..., एक्स n स्वतंत्र हैं मानक घातीय यादृच्छिक चर, तो जेड = मिनट (k: एक्स + ... + एक्स के < और लैम्ब्डा;) - 1 पोइसन (और लैम्ब्डा;) है।

तो, उस के साथ, मैं निम्नलिखित कोड अजगर में लिखा प्वासों मूल्यों उत्पन्न करने के लिए:

वर्ग के
class Poisson: 
    """Generate Poisson(lambda) values by using exponential 
    random variables.""" 

    def __init__(self, lam): 
     self.__lam = lam 

    def nextPoisson(self): 
     sum = 0 
     n = -1 
     while sum < self.__lam: 
      n += 1 
      sum -= math.log(random.random()) 
     return n 

उदाहरण उपयोग है:

# Generates a random value that is Poisson(lambda = 5) distributed 
poisson = Poisson(5) 
poisson_value = poisson.nextPoisson 

मैं इस यहां पोस्ट क्योंकि यह अच्छा है यह जानना कि इस तरह के रिश्ते मौजूद हैं, और यह उलटा परिवर्तन विधि आपको एक विशेष निरंतर वितरण के बाद यादृच्छिक मूल्यों को उत्पन्न करने का एक सामान्य तरीका प्रदान करती है।

+0

मैंने क्रमांकित सूची के स्वरूपण को आपके द्वारा लक्षित विश्वास के अनुसार तय किया है। यदि यह आपके इरादे से नहीं है, तो निश्चित रूप से परिवर्तन को वापस रोल करने के लिए स्वतंत्र महसूस करें। – Eddie

12

जैसा कि डेविड ने इंगित किया है, आपूर्ति की गई छद्म-यादृच्छिक संख्या जेनरेटर समान वितरण का उपयोग करता है।

अन्य दो के लिए, मैं Cern Colt पुस्तकालय कार्यों का प्रयोग करेंगे:

ये पुस्तकालय कार्यों को आसानी से आप एक यादृच्छिक संख्या प्रत्येक वितरण से लिया खोजने के लिए अनुमति देते हैं, आपको संभाव्यता घनत्व फ़ंक्शन या संचयी घनत्व फ़ंक्शन देने और आपको स्वयं को संख्या प्राप्त करने की अपेक्षा करने के बजाय (जो अपाचे कॉमन्स-मैथ दृष्टिकोण प्रतीत होता है):

RandomEngine engine = new DRand(); 
Poisson poisson = new Poisson(lambda, engine); 
int poissonObs = poisson.nextInt(); 

Normal normal = new Normal(mean, variance, engine); 
double normalObs = normal.nextDouble(); 

इसके अलावा, ध्यान रखें कि बड़े और लैम्ब्डा के लिए पोइसन वितरण पी (और लैम्ब्डा;); सामान्य वितरण एन (& lambda ;, sqrt (और lambda;)) द्वारा बहुत अच्छी तरह से अनुमानित किया जा सकता है।

+0

क्या उनके द्वारा उपयोग किए जाने वाले न्यूनतम और अधिकतम मूल्य को निर्दिष्ट करने का कोई तरीका है? मैंने जो देखा, उससे ऐसा प्रतीत नहीं होता है। –

+0

ऐसा इसलिए है क्योंकि पोइसन और सामान्य वितरण में अधिकतम या न्यूनतम नहीं है (अच्छी तरह से, पोइसन का न्यूनतम न्यूनतम 0 है)। –

+0

बहुत अच्छी लाइब्रेरी, धन्यवाद! – peq

6

मानक जावा आरएनजी (java.util.Random), और इसके उप-वर्ग जैसे java.security.SecureRandom, पहले से ही समान रूप से वितरित मूल्य उत्पन्न करते हैं।

उनके पास एक विधि भी है, nextGaussian, जो सामान्य रूप से वितरित मान देता है। डिफ़ॉल्ट रूप से, वितरण का मतलब शून्य का शून्य और मानक विचलन है, लेकिन यह मामूली रूप से tweaked है। बस आवश्यक s.d द्वारा गुणा करें। और आवश्यक मतलब जोड़ें। तो, उदाहरण के लिए, यदि आप सामान्य रूप से वितरित मूल्यों 6 का मतलब है एक और 2.5 के मानक विचलन के साथ करना चाहता था, आप यह करते हैं चाहते हैं:

double value = rng.nextGaussian() * 2.5 + 6; 

प्वासों बंटन स्पष्टतः समर्थित नहीं है, लेकिन आप नकली यह द्वारा कर सकते हैं Tom's Python code जैसा ही कर रहा है।

वैकल्पिक रूप से, आपको मेरे Uncommons Maths library में रुचि हो सकती है, जो सामान्य, पोइसन और अन्य वितरण के लिए उपयोगिता कक्षाएं प्रदान करता है।

+0

असामान्य लिंक 404 है। –

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