2009-10-07 21 views
5

मुझे एक यादृच्छिक संख्या जनरेटर की आवश्यकता है जो प्रोग्राम किए गए माध्य के साथ निर्दिष्ट सीमा पर संख्याएं चुनता है।गैर-वर्दी रैंडम नंबर जनरेटर कार्यान्वयन?

उदाहरण के लिए, मैं 2 और 14 के बीच के अंक लेने के लिए की जरूरत है और मैं यादृच्छिक संख्या की औसत 5.

मैं यादृच्छिक संख्या जनरेटर एक बहुत का उपयोग करने की आवश्यकता है। आम तौर पर मुझे बस एक समान वितरण की आवश्यकता होती है।

मुझे यह भी नहीं पता कि इस प्रकार के वितरण को क्या कॉल करना है।

आपके द्वारा प्रदान की जा सकने वाली किसी भी सहायता या अंतर्दृष्टि के लिए धन्यवाद।

+9

आप सुनिश्चित करें कि आप वितरण के बारे में पर्याप्त जानकारी उपलब्ध कराई गई हैं? मेरा मानना ​​है कि औसत मूल्य पर्याप्त नहीं है। इस उदाहरण पर विचार करें: मान लीजिए कि हम '{0, 1, 2} 'से यादृच्छिक संख्याएं 1 माध्य के साथ उत्पन्न करते हैं। अब इन दो जेनरेटर पर एक नज़र डालें: 'जेनरेटर 1 (0: 40%, 1: 20%, 2: 40%) ', जेनरेटर 2 (0: 10%, 1: 80%, 2: 10%)'। उनमें से दोनों के लिए औसत परिणाम 1. –

+1

एक डुप्लिकेट के पास होगा: http://stackoverflow.com/questions/977354/generating-non-uniform-random-numbers। और गैर-फ्लैट छद्म-यादृच्छिक वितरण एक मानक विषय हैं जिन्हें SO पर एक से अधिक बार संबोधित किया गया है। अधिक जानकारी दें और हम आपको सही दिशा में इंगित कर सकते हैं। – dmckee

+0

यदि लक्ष्य वितरण को एक अभिन्न पीडीएफ द्वारा आसानी से प्रदर्शित नहीं किया जाता है: http://stackoverflow.com/questions/423006/how-do-i-generate-points-that-match-a- हिस्टोग्राम – dmckee

उत्तर

0

मेरा पहला विचार होगा:

  • रेंज 0..1
  • पैमाने रेंज -9..9 लिए (एक्स 0.5; x * 18) में नंबर जेनरेट
  • पारी 5 से सीमा -> -4 .. 14 (5 जोड़ें)
  • 2..14 के लिए रेंज काटना (संख्या < 2 त्यागने)

कि आप रेंज आप चाहते हैं में संख्या देना चाहिए।

+0

लेकिन जैसा कि आप संख्याओं को त्यागते हैं <2 आपकी औसत चाल 5 से ऊपर की ओर है, है ना? –

6

यदि आप उस वितरण के आकार से खुश हैं, तो आप binomial distribution का उपयोग करने में सक्षम हो सकते हैं। एन = 12 और पी = 0.25 सेट करें। यह आपको 3 और 12 के बीच के बीच एक मान देगा। केवल श्रेणी को पाने के लिए प्रत्येक परिणाम में 2 जोड़ें और जिसका मतलब आप ढूंढ रहे हैं।

संपादित करें: कार्यान्वयन के लिए के रूप में, आप शायद उस असमान वितरण (मैं written one myself for Java है) का समर्थन करता है अपनी चुनी भाषा के लिए एक पुस्तकालय पा सकते हैं।

एक द्विपदीय वितरण को एक समान आरएनजी का उपयोग करके काफी आसानी से अनुमानित किया जा सकता है। बस एन परीक्षण करें और सफलताओं की संख्या रिकॉर्ड करें। तो यदि आपके पास एन = 10 और पी = 0.5 है, तो यह एक पंक्ति में 10 बार एक सिक्का फिसलने और सिर की संख्या की गिनती करने जैसा है। पी = 0.25 के लिए केवल 0 और 3 के बीच समान रूप से वितरित मान उत्पन्न करें और केवल शून्यों को सफलता के रूप में गिनें।

यदि आप एक अधिक कुशल कार्यान्वयन चाहते हैं, तो कुथ के द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग के वॉल्यूम 2 ​​के अभ्यास में एक चालाक एल्गोरिदम छिपा हुआ है।

+0

लिंक ["(मैंने जावा के लिए खुद को लिखा है)।"] (Https://uncommons-maths.dev.java.net/) उपलब्ध नहीं है – yishaiz

+1

@yishaiz बस इसे अपडेट किया गया। –

0

आपको एक वितरित/भारित यादृच्छिक संख्या जनरेटर की आवश्यकता है। शुरू करने के लिए Here's a reference

3

आपने यह नहीं कहा है कि आप किस वितरण के बाद हैं। आपके विशिष्ट उदाहरण के संबंध में, 2 और 8 के बीच एक समान वितरण उत्पन्न करने वाला एक फ़ंक्शन आपकी आवश्यकताओं को पूरा करेगा, जैसा कि आपने उन्हें लिखा है :)

+0

मुझे लगता है कि ओपी 9-14 से मूल्यों के लिए इच्छित होने की संभावना रखने के लिए इरादा रखता है। – fbrereto

1

यदि आप यादृच्छिक संख्या के गैर-समान वितरण चाहते हैं, तो हो सकता है कि आपके पास हो जैसे मानचित्रण के कुछ प्रकार, लागू करने के लिए:

// returns a number between 0..5 with a custom distribution 
int MyCustomDistribution() 
{ 
    int r = rand(100); // random number between 0..100 
    if (r < 10) return 1; 
    if (r < 30) return 2; 
    if (r < 42) return 3; 
    ... 
} 
1

आप एक समान एक से एक अ-समतल PRNG बना सकते हैं। यह समझ में आता है, क्योंकि आप एक समान पीआरएनजी लेने की कल्पना कर सकते हैं जो 0,1,2 देता है और मूल्य 2 के लिए 0,1 और 1 के मानों के लिए 0 लौटाकर एक नया, गैर वर्दी पीआरएनजी बना सकता है।

यदि आप अपने नए, गैर-वर्दी पीआरएनजी के वितरण पर विशिष्ट विशेषताओं को चाहते हैं तो इसके लिए और भी कुछ है। यह the Wikipedia page on PRNGs पर कवर किया गया है, और Ziggurat algorithm विशेष रूप से उल्लेख किया गया है।

उन संकेतों के साथ आप कुछ कोड खोज सकते हैं।

1

गैर-वर्दी जनरेटर के बारे में Wikipedia sub-article के आधार पर, ऐसा लगता है कि आप एक समान छद्म यादृच्छिक संख्या जेनरेटर के आउटपुट को उस क्षेत्र वितरण में लागू करना चाहते हैं जो वांछित माध्य को पूरा करता है।

0
Assign all numbers equal probabilities, 

जबकि currentAverage बराबर नहीं intendedAverage को (whithin संभव मार्जिन)

pickedNumber = pick one of the possible numbers (at random, uniform probability, if you pick intendedAverage pick again) 

if (pickedNumber is greater than intendedAverage and currentAverage<intendedAverage) or (pickedNumber is less than intendedAverage and currentAverage>intendedAverage) 

    increase pickedNumber's probability by delta at the expense of all others, conserving sum=100% 

else 

    decrease pickedNumber's probability by delta to the benefit of all others, conserving sum=100% 

end if 

delta=0.98*delta (the rate of decrease of delta should probably be experimented with) 

अंत जबकि

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