2010-08-18 27 views
14

मैं कुछ वितरण के अनुसार यादृच्छिक संख्या उत्पन्न करना चाहता हूं। मैं यह कैसे कर सकता हूँ?वितरण के अनुसार यादृच्छिक संख्याएं उत्पन्न करें

+2

इस तथ्य को छोड़कर कि कंप्यूटर केवल छद्म-यादृच्छिक संख्या उत्पन्न करता है, निश्चित रूप से यदि वे एक ज्ञात वितरण के लिए उत्पन्न होते हैं तो वे बिल्कुल यादृच्छिक नहीं होते हैं। आप किस नमूने के लिए नमूना डेटा उत्पन्न करना चाहते हैं? – Lazarus

+0

लाइब्रेरी को खोजने का सबसे आसान तरीका यह है कि यह करता है। क्या आपके मन में कोई विशेष भाषा है? –

+0

यदि आप जावा का उपयोग करते हैं, तो आप [डैन डायर द्वारा असामान्य गणित लाइब्रेरी] (http://maths.uncommons.org/) (* पिछली टिप्पणी * देखें) की कोशिश कर सकते हैं जो यादृच्छिक संख्या जेनरेटर, संभाव्यता वितरण, संयोजन और आंकड़े प्रदान करता है । – hengxin

उत्तर

15

मानक यादृच्छिक संख्या जेनरेटर जो आपको मिला है (rand() सी में एक सरल परिवर्तन के बाद, कई भाषाओं में समकक्ष) सीमा [0,1] पर एक समान वितरण के लिए काफी अच्छा अनुमान है। यदि आपको यही चाहिए, तो आप कर चुके हैं। यह कुछ हद तक बड़ी पूर्णांक सीमा पर उत्पन्न एक यादृच्छिक संख्या में परिवर्तित करने के लिए भी तुच्छ है।

एक सामान्य वितरण में एक समान वितरण के रूपांतरण में already been covered on SO है, जैसा कि Exponential distribution पर जा रहा है।

[संपादित करें]: triangular distribution के लिए, एक समान चर परिवर्तित अपेक्षाकृत आसान होता है (कुछ में सी-तरह):

double triangular(double a,double b,double c) { 
    double U = rand()/(double) RAND_MAX; 
    double F = (c - a)/(b - a); 
    if (U <= F) 
     return a + sqrt(U * (b - a) * (c - a)); 
    else 
     return b - sqrt((1 - U) * (b - a) * (b - c)); 
} 

कि सिर्फ सूत्र विकिपीडिया पृष्ठ पर दिए गए परिवर्तित है। यदि आप दूसरों को चाहते हैं, तो यह देखने के लिए जगह है; आम तौर पर, आप इच्छित वितरण के cumulative density function के ऊर्ध्वाधर धुरी पर एक बिंदु चुनने के लिए वर्दी चर का उपयोग करते हैं (मानते हैं कि यह निरंतर है), और वांछित वितरण के साथ यादृच्छिक मूल्य प्राप्त करने के लिए सीडीएफ को घुमाएं।

+0

नहीं, मुझे बस कुछ संख्याएं होने की आवश्यकता है जो घातीय, सामान्य, त्रिकोणीय ... आदि में हैं? रॉकवेल एरिना इनपुट विश्लेषक यह करता है लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए? –

+0

+1 मैं इस सी छद्म कोड की सराहना करता हूं, क्योंकि मैं त्रिभुज वितरण पर विकिपीडिया के लेख को देख रहा था, और यह समझ नहीं पाया कि इसे कोड में कैसे बदला जाए। एक सुधार: रैंड() 0 से RAND_MAX तक एक पूर्णांक देता है, इसलिए मुझे लगता है कि आप 'यू = ((डबल) रैंड())/RAND_MAX' चाहते हैं। अन्यथा, आपका वर्ग ((1 - यू) ...) काल्पनिक बाहर आने वाला है। – LarsH

+0

@ लार्सएच: अरे! भूल गए कि सी उस तरह अजीब है। सुधारों के लिए धन्यवाद। –

3

यह वास्तव में वितरण पर निर्भर करता है। सबसे सामान्य तरीका निम्नलिखित है। पी (एक्स) को संभावना है कि आपके वितरण के अनुसार उत्पन्न यादृच्छिक संख्या एक्स से कम है।

आप शून्य और एक के बीच वर्दी यादृच्छिक एक्स उत्पन्न करने के साथ शुरू करते हैं। इसके बाद आपको वाई जैसे पी (वाई) = एक्स और आउटपुट वाई मिलते हैं। आप बाइनरी सर्च का उपयोग करके ऐसे वाई को पा सकते हैं (चूंकि पी (एक्स) एक्स का बढ़ता कार्य है)।

यह बहुत ही कुशल नहीं है, लेकिन वितरण के लिए काम करता है जहां पी (एक्स) कुशलतापूर्वक गणना की जा सकती है।

3

आप नमूने को बदलने उलटा देख सकते हैं, अस्वीकृति यह करने के लिए सही तरीके से Devroye द्वारा पुस्तक के रूप में रूप में अच्छी तरह के नमूने "Nonuniform random variate generation"/स्प्रिंगर वेरलाग 1986

9

n-1 द्विआधारी वितरण में वितरण विघटित करने के लिए है। n-1 वितरण से समान रूप से

1. A/E: 0.20/0.80 
2. B/E: 0.40/0.60 
3. C/E: 0.40/0.60 
4. D/E: 0.80/0.20 

का चयन करें, और उसके बाद आधारित पहली या दूसरी प्रतीक का चयन करें:

A: 0.05 
B: 0.10 
C: 0.10 
D: 0.20 
E: 0.55 

आप 4 द्विआधारी वितरण में बदलने: यह करता है, तो आप इस प्रकार का वितरण किया है यदि बाइनरी वितरण में प्रत्येक संभावना है तो।

Code for this is here

+0

आप मानते हैं कि वितरण अलग है। – pjs

+0

मुझे यकीन है कि - प्रोग्रामिंग में सामान्य मामला है (उदा। संभाव्यता संक्रमण तालिका, छुपा मार्कोव मॉडल इत्यादि)। लेकिन अगर आपको लगता है कि विधि * निरंतर समय * है। इसका मतलब है कि विशाल वितरण को जुटाने के लिए प्रदर्शन समय नहीं है। तो निरंतर वितरण के लिए, आप इसे कई डिब्बे में विभाजित कर सकते हैं क्योंकि आपको पर्याप्त अनुमान लगाने और मेरी विधि का उपयोग करने की आवश्यकता है। –

+1

आपके द्वारा किए जाने वाले प्रोग्रामिंग में असतत आरवी सबसे आम हो सकते हैं, लेकिन हमारे काम के लिए हमें बहुत से गॉसियन, घातीय, त्रिकोणीय, लॉग-सामान्य, बीटा, गामा, वेबुल इत्यादि वितरण की आवश्यकता है। असतत वितरण के साथ भी वे अनंत श्रेणियों (पोइसन, ज्यामितीय) के लिए काम नहीं करते हैं। उपनाम तालिकाओं निरंतर समय में मूल्य उत्पन्न करते हैं लेकिन इसलिए सबसे निरंतर उलटा या रचनाएं करते हैं। इस बीच, तालिकाओं के साथ निरंतर वितरण का अनुमान लगाने से कम्प्यूटेशनल दृष्टिकोणों द्वारा भारी सेटअप और भंडारण की आवश्यकता नहीं होती है। लागू होने पर उपनाम तालिकाएं प्यारी होती हैं, लेकिन वे सामान्य समाधान नहीं हैं। – pjs

0

आप असतत डिब्बे से परिवर्तित कर सकते हैं फ्लोट करने के लिए/प्रक्षेप के साथ डबल। सरल रैखिक अच्छी तरह से काम करता है। यदि आपकी टेबल मेमोरी बाधित है तो अन्य इंटरपोलेशन विधियों का उपयोग किया जा सकता है। -jlp

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