जावास्क्रिप्ट का गणित कितना यादृच्छिक है।


116

6 साल से मैंने ए अपनी वेबसाइट पर यादृच्छिक संख्या जनरेटर पृष्ठ लिया है। लंबे समय तक, यह "यादृच्छिक संख्या जनरेटर" के लिए Google पर पहला या दूसरा परिणाम था और इसका उपयोग दर्जनों को तय करने के लिए किया गया है, यदि चर्चा मंचों और ब्लॉगों पर सैकड़ों प्रतियोगिता और चित्र नहीं हैं (मुझे पता है क्योंकि मैं अपने संदर्भों को देखता हूं वेब लॉग और आमतौर पर एक नज़र रखना)।

आज, किसी ने मुझे यह बताने के लिए ईमेल किया है कि यह उतना यादृच्छिक नहीं हो सकता जितना मैंने सोचा था।उसने बहुत बड़े यादृच्छिक संख्याएँ बनाने की कोशिश की (उदाहरण के लिए, 1 और 10000000000000000000 के बीच) और उन्होंने पाया कि वे लगभग हमेशा एक ही संख्या के अंक थे। वास्तव में, मैंने फ़ंक्शन को एक लूप में लपेटा ताकि मैं हजारों संख्याओं को उत्पन्न कर सकूं और निश्चित रूप से पर्याप्त हो, बहुत बड़ी संख्याओं के लिए, विविधता केवल परिमाण के 2 आदेशों के बारे में थी।

क्यों?

यहाँ पाशन संस्करण है, इसलिए आप इसे अपने लिए आज़मा सकते हैं:

http://andrew.hedges.name/experiments/random/randomness.html

इसमें मोज़िला डेवलपर नेटवर्क से लिया गया एक सीधा कार्यान्वयन दोनों शामिल हैं और 1997 से कुछ कोड शामिल हैं, जो मैंने एक वेब पेज से स्वाइप किया था जो अब मौजूद नहीं है (पॉल होउल का "सेंट्रल रेंडमाइजर 1.3")। प्रत्येक विधि कैसे काम करती है, यह देखने के लिए स्रोत देखें।

मैंने यहां और अन्य जगहों पर मेर्सन ट्विस्टर के बारे में पढ़ा है मुझे इसमें दिलचस्पी है कि जावास्क्रिप्ट के अंतर्निहित Math.random फ़ंक्शन से परिणामों में अधिक भिन्नता क्यों नहीं होगी । धन्यवाद!


"sarnath'd" के रूप में, पंच को पीटा, या इस मामले में, जवाब
मैटल

5
यदि आप शीर्षक में प्रश्न का उत्तर ढूंढ रहे हैं, तो stackoverflow.com/questions/2344312/…
एंड्रयू बी।

जवाबों:


182

1 और 100 के बीच की संख्या दी गई है।

  • 9 में 1 अंक (1-9) है
  • 90 के 2 अंक (10-99) हैं
  • 1 में 3 अंक होते हैं (100)

1 और 1000 के बीच की संख्या दी।

  • 9 में 1 अंक है
  • 90 में 2 अंक होते हैं
  • 900 में 3 अंक हैं
  • 1 में 4 अंक होते हैं

और इसी तरह।

इसलिए यदि आप यादृच्छिक रूप से कुछ का चयन करते हैं, तो उस विशाल संख्या में चयनित संख्याओं के अंकों की संख्या समान होगी, क्योंकि संभावित मूल्यों के विशाल बहुमत में अंकों की समान संख्या होती है।


11
यादृच्छिकता का आपका विचार पूरी तरह से और समान रूप से वितरित अर्थ है ...

19
@ R.Pate - यादृच्छिक संख्या पीढ़ी तब तक उपयोग नहीं होती है जब तक कि इसे समान रूप से लंबे पैमाने पर वितरित नहीं किया जाता है
annakata

3
दोबारा पढ़ें। @ डेविड केवल यह बता रहा है कि सीमाओं के बीच किस तरह की संख्याएँ हैं, न कि यादृच्छिक संख्याओं के चयन का परिणाम। मैं मानता हूं कि शीर्षक भ्रामक है।
nikc.org 10

3
रिकॉर्ड के लिए, मैंने इस और @ जूलार्ड के जवाब दोनों को वोट दिया। मैंने इसे स्वीकार किए गए उत्तर के रूप में चुना क्योंकि उदाहरण क्रिस्टल के रूप में स्पष्ट करते हैं कि संख्याओं के वितरण को अधिक अंकों के साथ तिरछा क्यों किया जाता है।
एंड्रयू हेजेस ने

1
@ andrew-hedges काफी सही है - यह स्पष्ट उत्तर है, लेकिन धन्यवाद :)
जूलार्ड

56

आपके परिणाम वास्तव में अपेक्षित हैं। यदि यादृच्छिक संख्याओं को समान रूप से 1 से 10 ^ n तक की सीमा में वितरित किया जाता है, तो आप संख्याओं के लगभग 9/10 भाग के लिए n अंक और एक और 9/100 के बीच n-1 अंक होने की उम्मीद करेंगे।


8
बिल्कुल सही। अनुमानों की संख्या का वितरण उम्मीद से कम है। हालांकि अंकों की संख्या के लॉग का वितरण समान होगा।
नोल्डोरिन

45

वहाँ विभिन्न प्रकार की यादृच्छिकता। math.random आपको संख्याओं का एक समान वितरण प्रदान करता है।

यदि आप परिमाण के अलग-अलग आदेश चाहते हैं, तो मैं सुझाव दूंगा कि एक एक्सपोनेंशियल फंक्शन का उपयोग करके इसे पावर लॉ डिस्ट्रीब्यूशन कहा जाए :

function random_powerlaw(mini, maxi) {
    return Math.ceil(Math.exp(Math.random()*(Math.log(maxi)-Math.log(mini)))*mini)
}

यह फ़ंक्शन आपको लगभग 1-अंकीय संख्याओं को 2-अंकीय संख्याओं के रूप में और 3-अंकीय संख्याओं के रूप में देना चाहिए।

सामान्य वितरण की तरह यादृच्छिक संख्याओं के लिए अन्य वितरण भी हैं (इसे गौसियन वितरण भी कहा जाता है)।


इस एल्गोरिथ्म के साथ, मैं डाल दिया minimum = 1और maximum = 10और कभी कभी एक परिणाम के रूप में 11 मिलेगा। आप शायद का उपयोग Math.floorकरने के बजाय मतलबMath.round
सैम ईटन

1
यह काम क्यों करता है? क्या यह समान वितरण को घातीय वितरण में बदल देता है?
shinzou

@shinzou मैं पर पूछा math.stackexchange और जवाब के रूप में एक अलग सूत्र मिला है। मैंने math.stackexchange से गणितीय रूप से व्युत्पन्न सूत्र को प्रतिबिंबित करने के लिए कोड को बदल दिया।
ईसाई

20

मुझे पूरी तरह से यादृच्छिक लगता है! (संकेत: यह ब्राउज़र पर निर्भर है।)

व्यक्तिगत रूप से, मुझे लगता है कि मेरा कार्यान्वयन बेहतर होगा, हालांकि मैंने इसे एक्सकेसीडी से चुरा लिया था , जिसे हमेशा स्वीकार किया जाना चाहिए:

function random() {
  return 4; // Chosen by a fair dice throw. Guaranteed to be random.
}

19
+1 यह उल्लेख करने के लिए ब्राउज़र निर्भर है, -1 लिंकिंग के बिना xkcd उधार लेने के लिए।

आवश्यक है या नहीं, चूंकि यह xkcd है, इसलिए इसे जिम्मेदार ठहराया जा रहा है। :)
अरफांगियन

2
OT: मैं आश्चर्यचकित और खुश हूं कि "XKCD" इस सप्ताह विश्वविद्यालय चुनौती के सवाल का जवाब था: डी
मैट सच

2
बर्गी: एक सीधा लिंक पर्याप्त नहीं है?
अरफांगियन

मुझे लगता है कि उनका मतलब है कि मजाक सही तरीके से उद्धृत नहीं किया गया था ("यादृच्छिक = 4?" के बजाय "वापसी 4?")
एरेन टेंटेकिन

18

निम्नलिखित पेपर बताता है कि प्रमुख वेब ब्राउज़रों में math.random () कैसे सुरक्षित है: "Amid क्लेन (2008) द्वारा" प्रमुख ब्राउज़रों में अस्थायी उपयोगकर्ता ट्रैकिंग और क्रॉस-डोमेन जानकारी रिसाव और हमलों "। । यह सामान्य जावा या विंडोज बिल्ट-इन PRNG फ़ंक्शन से अधिक मजबूत नहीं है।

दूसरी ओर, 2 ^ 19937-1 की अवधि के एसएफएमटी को लागू करने के लिए प्रत्येक PRNP अनुक्रम के लिए बनाए गए आंतरिक राज्य के 2496 बाइट्स की आवश्यकता होती है। कुछ लोग इसे अक्षम्य लागत मान सकते हैं।


1
+1: उल्लिखित पेपर महान है, जो मूल प्रश्न के बारे में बहुत दूर था।
रोलैंड इलिग

6

यदि आप 10000000000000000000 जैसी संख्या का उपयोग करते हैं तो आप डेटाटाइप की सटीकता से परे जा रहे हैं जावास्क्रिप्ट का उपयोग कर रहा है। ध्यान दें कि "00" में उत्पन्न सभी संख्याएं समाप्त होती हैं।


1
हालांकि इस मामले में उसकी समस्या नहीं है।
जॉय


IEE754 का वितरण भी नहीं है। हो सकता है कि आप दो के वेतन वृद्धि में 0 से 999 तक का प्रतिनिधित्व कर सकते हैं और इसके लिए पर्याप्त सटीकता है, इसलिए यदि आप कई बार नंबर लेते हैं तो आप उस सीमा में एक समान वितरण भी देख सकते हैं। 10% दो अंकों और 90% तीन अंकों का होगा। जब आप वास्तव में उच्च संख्या को हिट करना शुरू करते हैं, तो वेतन वृद्धि 1 से अधिक हो जाएगी। आप केवल एक ट्रिलियन बिलियन से एक ट्रिलियन बिलियन एक हज़ार और एक ट्रिलियन बिलियन और एक नहीं कर सकते हैं। हालांकि छोटी संख्या / पैमानों के लिए, यह प्रभाव न के बराबर होगा। पैमाने पर प्रभाव हालांकि अधिक प्रभाव पड़ेगा।
jgmjgm

5

मैंने अराजकता के खेल पर जेएस छद्म आयामी संख्या जनरेटर की कोशिश की ।

मेरा Sierpiński त्रिकोण अपने बहुत यादृच्छिक कहते हैं: भग्न


2
क्या आप यहां त्रिभुज कोड और jsfiddle / jsbin साझा करने का मन करेंगे ताकि हम विभिन्न ब्राउज़रों के लिए इसे आसानी से देख सकें?
फेब्रीको मट्टे

1
ठीक है, लेकिन मुझे कुछ दिन दें, क्योंकि मुझे अंग्रेजी में कोड का अनुवाद करना होगा। अब यह पॉलिश-इंग्लिश है और मेरे पास बहुत काम है।
zie1ony

1
@ zie1ony कुछ दिन ऊपर हैं।
trusktr

1
usp :( काम, काम, काम लिंक: kubaplas.vot.pl/green/fractal पहला पैरामीटर वर्टेक्स की nr है। दूसरा एक लाइन खंड के चौराहे (0 से 1) का एक बिंदु है। बस प्रयोग करें।
zie1ony

4
लिंक मृत - शायद इसके बजाय एक गितुब रेपो?
मार्क के कोवन

3

ठीक है, यदि आप 1e6 तक की संख्या उत्पन्न कर रहे हैं, तो आप उम्मीद करेंगे कि लगभग समान संभावना वाले सभी नंबर मिलेंगे। इसका मतलब यह भी है कि आपके पास केवल एक अंक प्राप्त करने के लिए दस में से एक मौका है। सौ अंकों में से एक दो अंक कम होने की संभावना, आदि। मुझे संदेह है कि आप एक और आरएनजी का उपयोग करते समय बहुत अंतर देखेंगे, क्योंकि आपके पास संख्याओं में समान वितरण है, न कि उनके लघुगणक।


0

गैर-यादृच्छिक संख्या 1 से एन तक समान रूप से वितरित की गई समान संपत्ति है। ध्यान दें कि (कुछ अर्थों में) यह सटीक की बात है। 0-99 पर एक समान वितरण (पूर्णांक के रूप में) की संख्या 90% होती है, जिसमें दो अंक होते हैं। 0-999999 पर एक समान वितरण के 905 नंबर होते हैं, जिनमें पाँच अंक होते हैं।

संख्या के किसी भी सेट (कुछ प्रतिबंधात्मक शर्तों के तहत) का घनत्व है। जब कोई "यादृच्छिक" संख्याओं पर चर्चा करना चाहता है, तो इन संख्याओं का घनत्व निर्दिष्ट किया जाना चाहिए (जैसा कि ऊपर उल्लेख किया गया है।) एक सामान्य घनत्व एक समान घनत्व है। अन्य हैं: घातीय घनत्व, सामान्य घनत्व, आदि। एक यादृच्छिक संख्या जनरेटर का प्रस्ताव करने से पहले कौन सा घनत्व प्रासंगिक है, यह चुनना चाहिए। इसके अलावा, एक घनत्व से आने वाली संख्याओं को अक्सर कैरीअस साधनों द्वारा आसानी से दूसरे घनत्व में बदल दिया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.