Random.nextGaussian() को 0 और std विचलन के साथ यादृच्छिक no.s देना है। कई संख्याओं को उत्पन्न किया गया है [1, + 1] की बाहरी सीमा है। मैं कैसे सेट कर सकता हूं ताकि यह सामान्य रूप से रेंज -1 से 1.Random.nextGaussian()
उत्तर
एक औसत 0 और मानक विचलन के साथ एक गॉसियन वितरण का मतलब है कि वितरण का औसत 0 है और लगभग 70% आबादी सीमा [-1, 1] में है। अपनी सीमा के बाहर की संख्याओं को अनदेखा करें - वे लगभग किसी भी तरफ 16% फ्रिंज बनाते हैं।
शायद बेहतर समाधान mean=0
और std.dev=0.5
के साथ वितरण उत्पन्न करना है। यह आपको श्रेणी [-1, 1] में लगभग 96% मानों के साथ वितरण प्रदान करेगा।
उपरोक्त के रूप में पिछड़े काम करने के लिए एक बेहतर समाधान है और लगभग इस विचार का उपयोग करना है। 99.7% मान 3-सिग्मा रेंज में हैं: std.dev = 1/3
का उपयोग करें। यह आपको प्राप्त होने वाले उपयोगी मूल्यों की मात्रा को लगभग समाप्त कर देगा। जब आप एक प्राप्त करते हैं, तो इसे छोड़ दें।
बेशक, यदि आप गणित गहन उत्पाद पर काम कर रहे हैं, तो यह सब कोई मूल्य नहीं है।
एक सामान्य वितरण गैर-शून्य (लेकिन "बहुत छोटा हो रहा है)) बाहर मूल्यों को देखने की संभावना देता है [ -1, +1] आप जो भी भिन्नता देते हैं - आप केवल वक्र को प्रभावी ढंग से घुमा रहे हैं।
आप एक छोटे से भिन्नता का उपयोग कर सकते हैं और फिर केवल एक मानचित्र के माध्यम से परिणाम चला सकते हैं, जो -1 से 1 से कम कुछ भी कम कर देता है, और 1 से 1 से अधिक कुछ भी होता है, लेकिन यह सामान्य रूप से (सख्ती से बोलना) नहीं होगा वितरण अब और भी।
रुचि के बाहर, आपको इस वितरण की क्या आवश्यकता है?
यह छोटा नहीं है।30% मानों के करीब 1 मानक विचलन होना चाहिए। 5% की तरह कुछ मानक विचलन के बाहर झूठ बोलेंगे। –
"बेहद छोटा होना" का अर्थ यह था कि आप इस अर्थ से आगे निकलते हैं, क्योंकि मूल्य उत्पन्न करने की संभावना कम हो जाती है, लेकिन फिर भी शून्य नहीं होती है। –
मैं एक सांख्यिकीय विश्लेषण कार्यक्रम लागू कर रहा हूं। यह सामान्य विचलन का उपयोग करता है। – BHS
क्या सामान्य वितरण में मध्यस्थता से औसत से संख्याएं शामिल नहीं हैं, लेकिन तेजी से छोटी संभावनाएं हैं? यह हो सकता है कि आपकी इच्छाएं (सामान्य और एक विशिष्ट सीमा तक सीमित) असंगत हों।
1.0 के मानक विचलन में यह शामिल है कि कई मान [-1,1] रेंज के बाहर झूठ बोलेंगे।
यदि आपको इस सीमा के भीतर रखने की आवश्यकता है, तो आपको दूसरी विधि का उपयोग करना चाहिए, शायद अगले दोहरी()।
आपके पैरामीटर के साथ गॉसियन वितरण। घनत्व ई^(- x^2/2) है। आम तौर पर यह फॉर्म ई^(रैखिक (एक्स) + रैखिक (x^2)) है जिसका अर्थ है कि आप जो भी सेटिंग्स देते हैं, आपको बहुत बड़ी और बहुत छोटी संख्याएं प्राप्त करने की कुछ संभावना है।
आप शायद कुछ अन्य वितरण की तलाश में हैं।
यह कोड कंसोल के लिए यादृच्छिक Gaussian संख्याओं की संख्या (एक पंक्ति में 10) प्रदर्शित करेगा और आपको बाद में कुछ आंकड़े (सबसे कम, उच्चतम और औसत) दिखाता है।
यदि आप इसे छोटे संख्या के साथ आज़माएं, तो यादृच्छिक संख्या शायद सीमा में होगी [-1.0 ... +1.0] और औसत सीमा में हो सकता है [-0.1 ... +0.1]। हालांकि, गिनती 10.000 से ऊपर है, तो यादृच्छिक संख्या शायद सीमा में गिर जाएगी [-4.0 ... +4.0] (अधिक असंभव संख्या दोनों सिरों पर दिखाई दे सकती है), हालांकि औसत सीमा में हो सकता है [-0.001 ... + 0.001] (0 के करीब रास्ता)।
public static void main(String[] args) {
int count = 20_000; // Generated random numbers
double lowest = 0; // For statistics
double highest = 0;
double average = 0;
Random random = new Random();
for (int i = 0; i < count; ++i) {
double gaussian = random.nextGaussian();
average += gaussian;
lowest = Math.min(gaussian, lowest);
highest = Math.max(gaussian, highest);
if (i%10 == 0) { // New line
System.out.println();
}
System.out.printf("%10.4f", gaussian);
}
// Display statistics
System.out.println("\n\nNumber of generated random values following Gaussian distribution: " + count);
System.out.printf("\nLowest value: %10.4f\nHighest value: %10.4f\nAverage: %10.4f", lowest, highest, (average/count));
}
बेशक, उन संख्याओं को अनदेखा करने का अर्थ है कि आपके यादृच्छिक मूल्य वास्तव में सामान्य नहीं हैं, है ना? –
उस परिभाषा के अनुसार, आप किसी भी यादृच्छिक संख्या जनरेटर पर किसी भी क्लैंपिंग को पूर्वाग्रह पेश कर रहे हैं। – dirkgently
@dirkgently: बिल्कुल। यह अब सामान्य वितरण नहीं है, केवल एक जो सामान्य वितरण की तरह "काफी" है। –