दिलचस्प पोस्ट
जावास्क्रिप्ट में यूआरएल के जीईटी पैरामीटर का उपयोग करना मैं सी # में एक मल्टी-कैरेक्टर डिलीमीटर द्वारा स्ट्रिंग कैसे विभाजित करूं? इमोजी (इमोटिकॉन) के कार्यान्वयन देखें / कीबोर्ड लेआउट ViewModel फॉर्म को कैसे बंद करना चाहिए? मैं ईमेल कैसे प्राप्त कर सकता हूं और इसे वेब एप्लिकेशन में प्रोसेस कर सकता हूं मैं किसी तृतीय-पक्ष एपीआई का उपयोग करते हुए सी # में एक फ़ाइल कैसे जंप करूँ? क्या एक इकाई निकाय अनुरोध एक HTTP डिलीएट अनुरोध के लिए है? निर्भरता इंजेक्शन के संदर्भ में एक संरचना रूट क्या है ओडीबीसी के बिना जावा से ऐक्सेस डाटाबेस को जोड़ना क्या किसी कैश डेटा से NSURLRequest को रोकने या एक अनुरोध के बाद कैश्ड डेटा को हटाना संभव है? बाल टैग में नेस्टेड नहीं केवल पाठ प्राप्त करने के लिए .text () का उपयोग करना जावास्क्रिप्ट में चयनित टेक्स्ट इवेंट ट्रिगर PostgreSQL अलग आदेश के साथ पर अलग आप एक बुफ़ेदार छवि कैसे क्लोन करते हैं आर – बूलीयन ऑपरेटर्स एंड एंड

Seedable जावास्क्रिप्ट यादृच्छिक संख्या जनरेटर

जावास्क्रिप्ट Math.random() फ़ंक्शन, 0 और 1 के बीच एक यादृच्छिक मान देता है, वर्तमान समय के आधार पर स्वचालित रूप से सीधा (मुझे विश्वास है कि जावा के समान)। हालांकि, मुझे नहीं लगता कि इसके लिए आप अपने ही बीज को स्थापित करने का कोई तरीका है।

मैं एक यादृच्छिक संख्या जनरेटर कैसे बना सकता हूं, जिसके लिए मैं अपना खुद का बीज मूल्य प्रदान कर सकता हूं, ताकि मैं इसे (छद्म) यादृच्छिक संख्याओं के पुनरावर्तनीय अनुक्रम का उत्पादन कर सकूं?

वेब के समाधान से एकत्रित समाधान "Seedable जावास्क्रिप्ट यादृच्छिक संख्या जनरेटर"

एक विकल्प http://davidbau.com/seedrandom है जो एक बीसीएबल आरसी 4-आधारित मठ है। रैंडम () अच्छे गुणों के साथ ड्रॉप-इन प्रतिस्थापन

यदि आप बीज निर्दिष्ट करने के लिए सक्षम होना चाहते हैं, तो आपको कॉल प्राप्त करने के लिए getSeconds() और getMinutes() । आप एक इंट में प्रवेश कर सकते हैं और सेकंड के मॉडेल्स के आधे हिस्से का इस्तेमाल कर सकते हैं और दूसरे आधे मॉड्यूल 60 आपको दूसरा हिस्सा दे सकते हैं।

कहा जा रहा है कि, यह विधि कचरा जैसा दिखता है उचित यादृच्छिक संख्या पीढ़ी करना बहुत मुश्किल है इस के साथ स्पष्ट समस्या यह है कि यादृच्छिक संख्या बीज सेकंड और मिनट पर आधारित है। बीज को अनुमान लगाने के लिए और यादृच्छिक संख्याओं की अपनी धारा को पुनः बनाने के लिए केवल 3600 अलग-अलग सेकंड और मिनट संयोजनों की आवश्यकता है। इसका भी मतलब है कि वहाँ केवल 3600 अलग संभव बीज हैं यह सही है, लेकिन मुझे शुरुआत से इस आरएनजी पर शक होना चाहिए।

यदि आप बेहतर आरएनजी का उपयोग करना चाहते हैं, तो मेर्सन ट्विस्टर का प्रयास करें। यह एक बड़ी कक्षा और उत्कृष्ट प्रदर्शन के साथ एक अच्छी तरह से परीक्षण और काफी मजबूत आरएनजी है।

संपादित करें: मुझे वास्तव में सही होना चाहिए और इसका एक छद्म यादृच्छिक संख्या जनरेटर या पीआरएनजी के रूप में देखें।

"जो कोई भी यादृच्छिक संख्या उत्पन्न करने के लिए अंकगणित तरीकों का उपयोग करता है, वह पाप की स्थिति में है।"
— जॉन वॉन न्यूमैन

यदि आपको बोने की क्षमता की ज़रूरत नहीं है, तो बस Math.random() उपयोग करें और इसके आस-पास सहायक कार्यों का निर्माण करें (जैसे। randRange(start, end) )।

मुझे यकीन नहीं है कि आप कौन सी आरएनजी का उपयोग कर रहे हैं, लेकिन यह जानना और दस्तावेज करना सबसे अच्छा है, जिससे आप इसकी विशेषताओं और सीमाओं के बारे में जानते हैं

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

 function RNG(seed) { // LCG using GCC's constants this.m = 0x80000000; // 2**31; this.a = 1103515245; this.c = 12345; this.state = seed ? seed : Math.floor(Math.random() * (this.m-1)); } RNG.prototype.nextInt = function() { this.state = (this.a * this.state + this.c) % this.m; return this.state; } RNG.prototype.nextFloat = function() { // returns in range [0,1] return this.nextInt() / (this.m - 1); } RNG.prototype.nextRange = function(start, end) { // returns in range [start, end): including start, excluding end // can't modulu nextInt because of weak randomness in lower bits var rangeSize = end - start; var randomUnder1 = this.nextInt() / this.m; return start + Math.floor(randomUnder1 * rangeSize); } RNG.prototype.choice = function(array) { return array[this.nextRange(0, array.length)]; } var rng = new RNG(20); for (var i = 0; i < 10; i++) console.log(rng.nextRange(10,50)); var digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; for (var i = 0; i < 10; i++) console.log(rng.choice(digits)); 

मैं मेर्सन ट्विस्टर का एक जावास्क्रिप्ट पोर्ट का उपयोग करता हूं: https://gist.github.com/300494 यह आपको मैन्युअल रूप से बीज सेट करने की अनुमति देता है इसके अलावा, जैसा कि दूसरे उत्तर में बताया गया है, मेर्सन ट्विस्टर एक बहुत अच्छा पीआरएनजी है।

आप जिस कोड को सूचीबद्ध करते हैं वह लेहमेर आरएनजी जैसा दिखता है यदि यह मामला है, तो 2147483647 सबसे बड़ा 32-बिट हस्ताक्षरित पूर्णांक है, 2147483647 सबसे बड़ा 32-बिट प्राइम है, और 48271 एक पूर्णकालिक गुणक है जो कि संख्याओं को उत्पन्न करने के लिए उपयोग किया जाता है।

यदि यह सत्य है, तो आप RandomNumberGenerator को एक अतिरिक्त पैरामीटर seed में लेने के लिए संशोधित कर सकते हैं, और फिर इसे सेट करें। seed को seed ; लेकिन आपको यह सुनिश्चित करने के लिए सावधान रहना होगा कि बीज के परिणामस्वरूप यादृच्छिक संख्या का एक अच्छा वितरण होगा (लेहमर ऐसा अजीब हो सकता है) – लेकिन अधिकांश बीज ठीक होंगे।

निम्नलिखित एक पीआरएनजी है जिसे कस्टम बीड दिया जा सकता है। कॉलिंग SeedRandom एक यादृच्छिक जनरेटर समारोह वापस करेगा। वर्तमान समय के साथ यादृच्छिक समारोह को वापस करने के लिए SeedRandom को कोई तर्क नहीं कहा जा सकता है, या इसे 1 या 2 गैर-नकारात्मक पहलुओं के साथ तर्क के रूप में कहा जा सकता है ताकि इसे उन पूर्णांक के साथ बीज मिल सके। केवल 1 मूल्य के साथ बिंदु सटीकता सीडिंग को फ़्लोट करने के कारण केवल 2 ^ 53 विभिन्न राज्यों में से जनरेटर को शुरू करने की अनुमति होगी।

यादृच्छिक जनरेटर समारोह में 1 पूर्णांक तर्क नामित limit , सीमा 1 से 42 9 4965886 में होनी चाहिए, फ़ंक्शन रेंज 0 से लेकर सीमा-1 में एक नंबर लौटाएगा।

 function SeedRandom(state1,state2){ var mod1=4294967087 var mul1=65539 var mod2=4294965887 var mul2=65537 if(typeof state1!="number"){ state1=+new Date() } if(typeof state2!="number"){ state2=state1 } state1=state1%(mod1-1)+1 state2=state2%(mod2-1)+1 function random(limit){ state1=(state1*mul1)%mod1 state2=(state2*mul2)%mod2 if(state1<limit && state2<limit && state1<mod1%limit && state2<mod2%limit){ return random(limit) } return (state1+state2)%limit } return random } 

उदाहरण उपयोग:

 var generator1=SeedRandom() //Seed with current time var randomVariable=generator1(7) //Generate one of the numbers [0,1,2,3,4,5,6] var generator2=SeedRandom(42) //Seed with a specific seed var fixedVariable=generator2(7) //First value of this generator will always be //1 because of the specific seed. 

यह जनरेटर निम्न गुण प्रदर्शित करता है:

  • इसमें लगभग 2 ^ 64 विभिन्न संभव आंतरिक राज्य हैं।
  • इसमें लगभग 2 ^ 63 की अवधि है, किसी भी व्यक्ति की तुलना में बहुत अधिक किसी भी वास्तविकता को जावास्क्रिप्ट कार्यक्रम में कभी भी ज़रूरत नहीं होगी।
  • mod मूल्यों की कीमतों के कारण उत्पादन में कोई आसान पैटर्न नहीं है, कोई सीमा नहीं चुना हुआ सीमा यह कुछ सरल पीआरएनजी के विपरीत है जो कुछ व्यवस्थित पैटर्नों को प्रदर्शित करता है।
  • यह कुछ नतीजे निकालता है ताकि एक पूर्ण वितरण प्राप्त हो सके।
  • यह अपेक्षाकृत धीमी है, मेरी मशीन पर प्रति सेकंड 10 000 000 बार प्रति सेकंड चलता है।

यदि आप टाइपस्क्रिप्ट में प्रोग्राम करते हैं, तो मैंने मेर्सन ट्विस्टर कार्यान्वयन को रूपांतरित किया था जिसे क्रिस्टोफ हेन्केलमैन के एक टाइपस्क्रिप्ट वर्ग के रूप में इस धागे के उत्तर में लाया गया था:

 /** * copied almost directly from Mersenne Twister implementation found in https://gist.github.com/banksean/300494 * all rights reserved to him. */ export class Random { static N = 624; static M = 397; static MATRIX_A = 0x9908b0df; /* constant vector a */ static UPPER_MASK = 0x80000000; /* most significant wr bits */ static LOWER_MASK = 0x7fffffff; /* least significant r bits */ mt = new Array(Random.N); /* the array for the state vector */ mti = Random.N + 1; /* mti==N+1 means mt[N] is not initialized */ constructor(seed:number = null) { if (seed == null) { seed = new Date().getTime(); } this.init_genrand(seed); } private init_genrand(s:number) { this.mt[0] = s >>> 0; for (this.mti = 1; this.mti < Random.N; this.mti++) { var s = this.mt[this.mti - 1] ^ (this.mt[this.mti - 1] >>> 30); this.mt[this.mti] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) + this.mti; /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ /* 2002/01/09 modified by Makoto Matsumoto */ this.mt[this.mti] >>>= 0; /* for >32 bit machines */ } } /** * generates a random number on [0,0xffffffff]-interval * @private */ private _nextInt32():number { var y:number; var mag01 = new Array(0x0, Random.MATRIX_A); /* mag01[x] = x * MATRIX_A for x=0,1 */ if (this.mti >= Random.N) { /* generate N words at one time */ var kk:number; if (this.mti == Random.N + 1) /* if init_genrand() has not been called, */ this.init_genrand(5489); /* a default initial seed is used */ for (kk = 0; kk < Random.N - Random.M; kk++) { y = (this.mt[kk] & Random.UPPER_MASK) | (this.mt[kk + 1] & Random.LOWER_MASK); this.mt[kk] = this.mt[kk + Random.M] ^ (y >>> 1) ^ mag01[y & 0x1]; } for (; kk < Random.N - 1; kk++) { y = (this.mt[kk] & Random.UPPER_MASK) | (this.mt[kk + 1] & Random.LOWER_MASK); this.mt[kk] = this.mt[kk + (Random.M - Random.N)] ^ (y >>> 1) ^ mag01[y & 0x1]; } y = (this.mt[Random.N - 1] & Random.UPPER_MASK) | (this.mt[0] & Random.LOWER_MASK); this.mt[Random.N - 1] = this.mt[Random.M - 1] ^ (y >>> 1) ^ mag01[y & 0x1]; this.mti = 0; } y = this.mt[this.mti++]; /* Tempering */ y ^= (y >>> 11); y ^= (y << 7) & 0x9d2c5680; y ^= (y << 15) & 0xefc60000; y ^= (y >>> 18); return y >>> 0; } /** * generates an int32 pseudo random number * @param range: an optional [from, to] range, if not specified the result will be in range [0,0xffffffff] * @return {number} */ nextInt32(range:[number, number] = null):number { var result = this._nextInt32(); if (range == null) { return result; } return (result % (range[1] - range[0])) + range[0]; } /** * generates a random number on [0,0x7fffffff]-interval */ nextInt31():number { return (this._nextInt32() >>> 1); } /** * generates a random number on [0,1]-real-interval */ nextNumber():number { return this._nextInt32() * (1.0 / 4294967295.0); } /** * generates a random number on [0,1) with 53-bit resolution */ nextNumber53():number { var a = this._nextInt32() >>> 5, b = this._nextInt32() >>> 6; return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0); } } 

आप इसका उपयोग निम्नानुसार कर सकते हैं:

 var random = new Random(132); random.nextInt32(); //return a pseudo random int32 number random.nextInt32([10,20]); //return a pseudo random int in range [10,20] random.nextNumber(); //return aa pseudo random number in range [0,1] 

अधिक तरीकों के लिए स्रोत की जांच करें

नोट: यह कोड मूलतः ऊपर दिए प्रश्न में शामिल था। प्रश्न को छोटा और ध्यान केंद्रित रखने के हितों में, मैंने इसे इस सामुदायिक विकी उत्तर में स्थानांतरित कर दिया है।

मुझे यह कोड मिलकर लात मार रहा है और यह यादृच्छिक संख्या प्राप्त करने के लिए ठीक काम करता है और बाद में बीज का उपयोग करता है, लेकिन मुझे पूरा यकीन नहीं है कि तर्क कैसे काम करता है (जैसे, जहां 2345678901, 48271 और 2147483647 नंबर आए थे)।

 function nextRandomNumber(){ var hi = this.seed / this.Q; var lo = this.seed % this.Q; var test = this.A * lo - this.R * hi; if(test > 0){ this.seed = test; } else { this.seed = test + this.M; } return (this.seed * this.oneOverM); } function RandomNumberGenerator(){ var d = new Date(); this.seed = 2345678901 + (d.getSeconds() * 0xFFFFFF) + (d.getMinutes() * 0xFFFF); this.A = 48271; this.M = 2147483647; this.Q = this.M / this.A; this.R = this.M % this.A; this.oneOverM = 1.0 / this.M; this.next = nextRandomNumber; return this; } function createRandomNumber(Min, Max){ var rand = new RandomNumberGenerator(); return Math.round((Max-Min) * rand.next() + Min); } //Thus I can now do: var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; var numbers = ['1','2','3','4','5','6','7','8','9','10']; var colors = ['red','orange','yellow','green','blue','indigo','violet']; var first = letters[createRandomNumber(0, letters.length)]; var second = numbers[createRandomNumber(0, numbers.length)]; var third = colors[createRandomNumber(0, colors.length)]; alert("Today's show was brought to you by the letter: " + first + ", the number " + second + ", and the color " + third + "!"); /* If I could pass my own seed into the createRandomNumber(min, max, seed); function then I could reproduce a random output later if desired. */ 

बस निर्माता का मानकीकरण करें और बीज सेट करें:

 function RandomNumberGenerator(Seed){ var d = new Date(); this.seed = Seed; this.A = 48271; this.M = 2147483647; this.Q = this.M / this.A; this.R = this.M % this.A; this.oneOverM = 1.0 / this.M; this.next = nextRandomNumber; return this; } 

और अपने फ़ंक्शन को समायोजित करें जो इस तरह यादृच्छिक संख्या जनरेटर बनाता है:

 function createRandomNumber(Seed, Min, Max){ var rand = new RandomNumberGenerator(Seed); return Math.round((Max-Min) * rand.next() + Min); } 

और इस तरह कॉल करें:

 var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; var numbers = ['1','2','3','4','5','6','7','8','9','10']; var colors = ['red','orange','yellow','green','blue','indigo','violet']; var seed = <generate seed>; var first = createRandomNumber(seed, 0, letters.length); var second = createRandomNumber(seed, 0, numbers.length); var third = createRandomNumber(seed, 0, colors.length); 

ठीक है, यहां पर जिस समाधान पर मैंने तय किया है, वह है।

पहले आप "नवासी ()" फ़ंक्शन का उपयोग करके बीज मूल्य बनाते हैं। फिर आप बीज मूल्य "srandom ()" फ़ंक्शन पर पास करें अंत में, "srandom ()" फ़ंक्शन 0 और 1 के बीच छद्म यादृच्छिक मान देता है

महत्वपूर्ण बिट यह है कि बीज मान एक सरणी के अंदर जमा है। अगर यह केवल एक पूर्णांक या फ्लोट थे, तो फ़ंक्शन को बुलाया गया हर बार मूल्य को अधिलेखित कर दिया जाएगा, क्योंकि पूर्णांक, फ़्लोट्स, स्ट्रिंग्स आदि के मूल्यों को सीधे स्टैक्स बना दिया जाता है, बस सरणियों के मामले में और पॉइंट्स बनाते हैं। अन्य वस्तुओं इस प्रकार, यह बीज के मूल्य के लिए संभव है ताकि लगातार बने रहें।

अंत में, "srandom ()" फ़ंक्शन को परिभाषित करना संभव है जैसे कि यह "मठ" ऑब्जेक्ट की एक विधि है, लेकिन मैं यह समझाने के लिए आपके ऊपर छोड़ दूँगा 😉

सौभाग्य!

जावास्क्रिप्ट:

 // Global variables used for the seeded random functions, below. var seedobja = 1103515245 var seedobjc = 12345 var seedobjm = 4294967295 //0x100000000 // Creates a new seed for seeded functions such as srandom(). function newseed(seednum) { return [seednum] } // Works like Math.random(), except you provide your own seed as the first argument. function srandom(seedobj) { seedobj[0] = (seedobj[0] * seedobja + seedobjc) % seedobjm return seedobj[0] / (seedobjm - 1) } // Store some test values in variables. var my_seed_value = newseed(230951) var my_random_value_1 = srandom(my_seed_value) var my_random_value_2 = srandom(my_seed_value) var my_random_value_3 = srandom(my_seed_value) // Print the values to console. Replace "WScript.Echo()" with "alert()" if inside a Web browser. WScript.Echo(my_random_value_1) WScript.Echo(my_random_value_2) WScript.Echo(my_random_value_3) 

लुआ 4 (मेरा निजी लक्ष्य पर्यावरण):

 -- Global variables used for the seeded random functions, below. seedobja = 1103515.245 seedobjc = 12345 seedobjm = 4294967.295 --0x100000000 -- Creates a new seed for seeded functions such as srandom(). function newseed(seednum) return {seednum} end -- Works like random(), except you provide your own seed as the first argument. function srandom(seedobj) seedobj[1] = mod(seedobj[1] * seedobja + seedobjc, seedobjm) return seedobj[1] / (seedobjm - 1) end -- Store some test values in variables. my_seed_value = newseed(230951) my_random_value_1 = srandom(my_seed_value) my_random_value_2 = srandom(my_seed_value) my_random_value_3 = srandom(my_seed_value) -- Print the values to console. print(my_random_value_1) print(my_random_value_2) print(my_random_value_3)