2010-01-31 11 views
16

आकार n की एक सरणी मैं प्रत्येक सूचकांक में इस तरह के लिए यादृच्छिक संभावनाओं कि Sigma(a[0]..a[n-1])=1एक प्रायिकता वितरण

एक संभावित परिणाम हो सकता है उत्पन्न करना चाहते हैं को देखते हुए जा रही हैं:

0  1  2  3  4 
0.15 0.2 0.18 0.22 0.25 

एक और पूरी तरह से कानूनी परिणाम हो सकते हैं:

0  1  2  3  4 
0.01 0.01 0.96 0.01 0.01 

मैं इन्हें आसानी से और जल्दी कैसे उत्पन्न कर सकता हूं? किसी भी भाषा में जवाब ठीक हैं, जावा पसंदीदा।

+0

तक सिग्मा आप मानक विचलन मतलब है? मुझे आशा है कि आपको एहसास होगा कि जैसे ही आप मानक विचलन कहते हैं, आप स्वचालित रूप से संकेत देते हैं कि आप सामान्य वितरण से अपनी यादृच्छिक संख्याएं खींचे हैं। – ldog

+0

वर्दी वितरण से अधिकांश कंप्यूटर आरएनजी की ड्रा संख्याएं। – ldog

+0

आप इस मुद्दे को साकार कर सकते हैं कि केंद्रीय सीमा प्रमेय सहायता कर सकता है: http://en.wikipedia.org/wiki/Central_limit_theorem – ldog

उत्तर

15

जो कार्य आप पूरा करने की कोशिश कर रहे हैं वह एन-आयामी इकाई सरल से यादृच्छिक बिंदु बनाने के लिए tantamount है।

http://en.wikipedia.org/wiki/Simplex#Random_sampling आपकी मदद कर सकता है।

एक अनुभवहीन समाधान निम्नलिखित के रूप में जाना हो सकता है:

public static double[] getArray(int n) 
    { 
     double a[] = new double[n]; 
     double s = 0.0d; 
     Random random = new Random(); 
     for (int i = 0; i < n; i++) 
     { 
      a [i] = 1.0d - random.nextDouble(); 
      a [i] = -1 * Math.log(a[i]); 
      s += a[i]; 
     } 
     for (int i = 0; i < n; i++) 
     { 
      a [i] /= s; 
     } 
     return a; 
    } 

एन आयामी इकाई सिंप्लेक्स से एक बिंदु समान रूप से आकर्षित करने के लिए, हम, तेजी वितरित यादृच्छिक चर का एक वेक्टर रखना चाहिए तो यह सामान्य उन चर के योग से। एक घातीय रूप से वितरित मूल्य प्राप्त करने के लिए, हम समान रूप से वितरित मूल्य के नकारात्मक log लेते हैं।

+3

अधिकांश भाषाओं में, आपको केवल एक बार 'रैंडम' बनाना चाहिए, या आपको यादृच्छिक परिणाम नहीं मिलेगा (और कई मामलों में - एक ही संख्या अधिक से अधिक)। मैं 'लॉग' के उपयोग के बारे में भी चिंतित हूं - क्या आप कृपया बता सकते हैं कि यह क्यों है? अच्छे संदर्भ के लिए – Kobi

+0

+1, लेकिन मुझे लगता है कि 'nextDouble() 'पहले से ही समान वितरण के लिए समायोजित है: http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextDouble() – trashgod

+0

कोबी, 'नई रैंडम()' चीज़ को इंगित करने के लिए धन्यवाद। 'लॉग' के लिए - मैंने अपनी पोस्ट को और अधिक विस्तृत स्पष्टीकरण शामिल करने के लिए संपादित किया है। – viaclectic

22

एन यादृच्छिक संख्या प्राप्त करें, उनकी राशि की गणना करें और योग के साथ प्रत्येक संख्या को विभाजित करके राशि को सामान्य करें।

+0

नाइस :) इसके बारे में नहीं सोचा था ... תודה! –

+12

यह पूर्वाग्रह पेश करता है। आप इस तरह से एक सरल से नमूना नमूना नहीं कर सकते हैं। – dreeves

+0

@dreeves - क्या आप विस्तृत कर सकते हैं? इस पेपर के –

0

यदि आप सामान्य वितरण से मूल्यों को कुशलता से उत्पन्न करना चाहते हैं, तो Box Muller Transformation आज़माएं।

+0

अच्छी टिप लेते हैं, लेकिन मुझे विश्वास है कि यह जर्मनी नहीं है। – dreeves

1

यह अपेक्षाकृत देर से है, लेकिन इस paper में दिए गए @ कोबी के सरल और सीधा जवाब में संशोधन दिखाने के लिए @ ड्रीव्स द्वारा इंगित किया गया है जो नमूनाकरण वर्दी बनाता है। विधि (अगर मैं इसे स्पष्ट रूप से समझ)

  1. को उत्पन्न है n-1 रेंज से अलग मूल्यों [1, 2, ..., एम -1]।
  2. परिणामी वेक्टर
  3. परिणामस्वरूप वेक्टर के पहले और अंतिम तत्वों के रूप में 0 और एम जोड़ें।
  4. x i - x i-1 जहां i = 1,2, ... n कंप्यूटिंग करके एक नया वेक्टर उत्पन्न करें। यही है, नया वेक्टर पुराने वेक्टर के लगातार तत्वों के बीच मतभेदों से बना है।
  5. एम द्वारा नए वेक्टर के प्रत्येक तत्व को विभाजित करें। आपके पास एक समान वितरण है!

मैं अगर अलग यादृच्छिक मान पैदा करने और उनका योग से विभाजित भी एक समान वितरण का उत्पादन करेगा द्वारा 1 करने के लिए उन्हें सामान्य जानने के लिए उत्सुक हूँ।

0

एन यादृच्छिक संख्या प्राप्त करें, उनकी राशि की गणना करें और योग के साथ प्रत्येक संख्या को विभाजित करके 1 पर सामान्यीकृत करें।

Expanding on Kobi's answer, यहां एक जावा फ़ंक्शन है जो ठीक है।

public static double[] getRandDistArray(int n) { 
    double randArray[] = new double[n]; 
    double sum = 0; 

    // Generate n random numbers 
    for (int i = 0; i < randArray.length; i++) { 
     randArray[i] = Math.random(); 
     sum += randArray[i]; 
    } 

    // Normalize sum to 1 
    for (int i = 0; i < randArray.length; i++) { 
     randArray[i] /= sum; 
    } 
    return randArray; 
} 

एक परीक्षण समय में, getRandDistArray(5) लौटे निम्नलिखित

[0.1796505603694718, 0.31518724882558813, 0.15226147256596428, 0.30954417535503603, 0.043356542883939767] 
संबंधित मुद्दे