जावास्क्रिप्ट में यादृच्छिक संख्या जनरेटर सीडिंग


372

क्या जावास्क्रिप्ट में यादृच्छिक संख्या जनरेटर (Math.random) को बीज करना संभव है?


यह स्पष्ट नहीं है कि क्या आप इसे बीज बनाना चाहते हैं ताकि आपको अलग-अलग टेस्ट रन के लिए बार-बार एक ही परिणाम प्राप्त हो या आप इसे उपयोग के बीच बेहतर यादृच्छिकता के लिए प्रति उपयोगकर्ता 'कुछ विशिष्ट' के साथ बीज करना चाहें।
simbo1905

2
नहीं, दुर्भाग्य से यह संभव नहीं है। jsrand एक छोटी सी लाइब्रेरी है जिसे मैंने तब लिखा जब मुझे एक उपयोगी PRNG की आवश्यकता थी। अन्य अधिक जटिल पुस्तकालय भी हैं जो आप इसके लिए गुग्लिंग पा सकते हैं।
डोमनिको डी फेलिस

4
इस सवाल को जोड़ना: यह कैसे संभव है कि एक PRNG की पेशकश करने के लिए एक अच्छा विचार यह बीज के बिना एक साधन है ?? क्या इसका कोई अच्छा कारण है?
एलन

जवाबों:


188

नहीं, यह नहीं है, लेकिन अपने स्वयं के जनरेटर को लिखना काफी आसान है, या बेहतर अभी तक एक मौजूदा का उपयोग करना है। बाहर की जाँच करें: यह संबंधित प्रश्न

इसके अलावा, सीडिंग के बारे में अधिक जानकारी के लिए डेविड बाउ के ब्लॉग को देखें


159

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

(मूल रूप से एक टिप्पणी में प्रस्तुत एक चतुर विचार से दूसरे उत्तर के लिए अनुकूलित।)

var seed = 1;
function random() {
    var x = Math.sin(seed++) * 10000;
    return x - Math.floor(x);
}

आप seedकिसी भी संख्या के लिए सेट कर सकते हैं , बस शून्य (या Math.PI के किसी भी एकाधिक) से बचें।

इस समाधान की भव्यता, मेरी राय में, किसी भी "जादू" संख्या की कमी से आती है (10000 के अलावा, जो अंकों की न्यूनतम राशि के बारे में दर्शाता है जो आपको अजीब पैटर्न से बचने के लिए फेंकना चाहिए - 10 , 100 , 1000 मानों के साथ परिणाम देखें )। ब्रेविटी भी अच्छी है।

यह Math.random () या 2 या 3 के एक कारक से थोड़ा धीमा है, लेकिन मेरा मानना ​​है कि यह जावास्क्रिप्ट में लिखे गए किसी भी अन्य समाधान के रूप में तेजी से है।


20
क्या इस RNG संख्या को समान रूप से वितरित करने वाली संख्या को साबित करने का कोई तरीका है? प्रायोगिक तौर पर ऐसा लगता है: jsfiddle.net/bhrLT
नाथन ब्रेइट

6
6,000,000 ऑप्स / सेकंड बहुत तेज़ है, मैं प्रति क्लिक ~ 3,000,000 से अधिक उत्पन्न करने की योजना नहीं करता हूं। किडिंग, यह शानदार है।
AMK

59
-1, यह बिल्कुल एक समान नमूना नहीं है - यह 0 और 1 की ओर काफी पक्षपाती है (देखें jsfiddle.net/bhrLT/17 , जिसे गणना करने में थोड़ा समय लग सकता है)। लगातार मूल्य सहसंबद्ध होते हैं - प्रत्येक 355 मान, और इससे भी अधिक हर 710, संबंधित हैं। कृपया कुछ और सावधानी से सोच-समझकर प्रयोग करें!
स्पेंसर नेल्सन

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

15
सावधान रहे। Math.sin () क्लाइंट और सर्वर पर अलग-अलग परिणाम दे सकता है। मैं उल्का का उपयोग करता हूं (क्लाइंट और सर्वर पर जावास्क्रिप्ट का उपयोग करता है)।
ओबीवाहन

145

मैंने सादे जावास्क्रिप्ट में कई अच्छे, छोटे और तेज Pseudorandom नंबर जनरेटर (PRNG) कार्यों को लागू किया है। उन सभी को सीड किया जा सकता है और अच्छी गुणवत्ता वाले नंबर प्रदान किए जा सकते हैं।

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

शुक्र है कि PRNG के लिए शॉर्ट स्ट्रिंग्स से बीज उत्पन्न करने में हैश फ़ंक्शन बहुत अच्छे हैं। एक अच्छा हैश फ़ंक्शन दो स्ट्रिंग्स समान होने पर भी बहुत भिन्न परिणाम उत्पन्न करेगा। यहाँ एक उदाहरण मुरमुरैश 3 के मिक्सिंग फंक्शन पर आधारित है:

function xmur3(str) {
    for(var i = 0, h = 1779033703 ^ str.length; i < str.length; i++)
        h = Math.imul(h ^ str.charCodeAt(i), 3432918353),
        h = h << 13 | h >>> 19;
    return function() {
        h = Math.imul(h ^ h >>> 16, 2246822507);
        h = Math.imul(h ^ h >>> 13, 3266489909);
        return (h ^= h >>> 16) >>> 0;
    }
}

के बाद के प्रत्येक कॉल वापसी समारोह का xmur3एक नया "यादृच्छिक" 32-बिट हैश एक PRNG में एक बीज के रूप में प्रयोग की जाने वाली मूल्य पैदा करता है। यहां बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं:

// Create xmur3 state:
var seed = xmur3("apples");
// Output four 32-bit hashes to provide the seed for sfc32.
var rand = sfc32(seed(), seed(), seed(), seed());

// Output one 32-bit hash to provide the seed for mulberry32.
var rand = mulberry32(seed());

// Obtain sequential random numbers like so:
rand();
rand();

वैकल्पिक रूप से, बस बीज को पैड करने के लिए कुछ डमी डेटा चुनें, और प्रारंभिक अवस्था को अच्छी तरह से मिलाने के लिए जनरेटर को कुछ बार (12-20 पुनरावृत्तियों) अग्रिम करें। यह अक्सर PRNGs के संदर्भ कार्यान्वयन में देखा जाता है, लेकिन यह प्रारंभिक राज्यों की संख्या को सीमित करता है।

var seed = 1337 ^ 0xDEADBEEF; // 32-bit seed with optional XOR value
// Pad seed with Phi, Pi and E.
// https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number
var rand = sfc32(0x9E3779B9, 0x243F6A88, 0xB7E15162, seed);
for (var i = 0; i < 15; i++) rand();

इन PRNG फ़ंक्शंस का आउटपुट एक सकारात्मक 32-बिट संख्या (0 से 2 32 -1) का उत्पादन करता है, जिसे बाद में 0-1 (0 समावेशी, 1 अनन्य) के बीच एक फ्लोटिंग-पॉइंट नंबर में बदल दिया जाता है Math.random(), यदि आप यादृच्छिक संख्या चाहते हैं किसी विशिष्ट श्रेणी का, MDN पर यह लेख पढ़ें । यदि आप केवल कच्चे बिट्स चाहते हैं, तो बस अंतिम विभाजन ऑपरेशन को हटा दें।

ध्यान देने योग्य एक और बात जेएस की सीमाएं हैं। नंबर केवल 53-बिट रिज़ॉल्यूशन तक पूरे पूर्णांक का प्रतिनिधित्व कर सकते हैं। और बिटवाइज़ ऑपरेशन का उपयोग करते समय, यह 32 तक कम हो जाता है। इससे C या C ++ में लिखे एल्गोरिदम को लागू करना मुश्किल हो जाता है, जो कि 64-बिट संख्या का उपयोग करते हैं। 64-बिट कोड को पोर्ट करने के लिए शिम की आवश्यकता होती है जो प्रदर्शन को काफी कम कर सकता है । तो सादगी और दक्षता के लिए, मैंने केवल एल्गोरिदम पर विचार किया है जो 32-बिट गणित का उपयोग करता है, क्योंकि यह सीधे जेएस के साथ संगत है।

अब, जनरेटर के लिए आगे। (मैं यहां संदर्भ के साथ पूरी सूची बनाए रखता हूं )


sfc32 (सरल फास्ट काउंटर)

sfc32 प्रैक्ट्रैंड रैंडम नंबर टेस्टिंग सूट का हिस्सा है (जो यह पाठ्यक्रम से गुजरता है)। sfc32 में 128-बिट स्थिति है और JS में बहुत तेज़ है।

function sfc32(a, b, c, d) {
    return function() {
      a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0; 
      var t = (a + b) | 0;
      a = b ^ b >>> 9;
      b = c + (c << 3) | 0;
      c = (c << 21 | c >>> 11);
      d = d + 1 | 0;
      t = t + d | 0;
      c = c + t | 0;
      return (t >>> 0) / 4294967296;
    }
}

Mulberry32

शहतूत32 एक 32-बिट राज्य के साथ एक सरल जनरेटर है, लेकिन बहुत तेज़ है और इसमें अच्छी गुणवत्ता है (लेखक बताता है कि यह gjrand परीक्षण सूट के सभी परीक्षण पास करता है और इसमें पूर्ण 2 32 अवधि है, लेकिन मैंने सत्यापित नहीं किया है)।

function mulberry32(a) {
    return function() {
      var t = a += 0x6D2B79F5;
      t = Math.imul(t ^ t >>> 15, t | 1);
      t ^= t + Math.imul(t ^ t >>> 7, t | 61);
      return ((t ^ t >>> 14) >>> 0) / 4294967296;
    }
}

यदि आप सिर्फ एक सरल लेकिन सभ्य PRNG की जरूरत है और मैं यादृच्छिक संख्या ( जन्मदिन की समस्या देखें ) के अरबों की जरूरत नहीं है, तो मैं यह सिफारिश करेंगे ।

xoshiro128 **

मई 2018 तक, जोशी / ब्लैकमैन (जिन्होंने क्रोम में उपयोग किया जाता है, जो कि Xoroshiro भी लिखा है) द्वारा , Xoshiro128 ** Xorshift परिवार का नया सदस्य है । यह सबसे तेज़ जनरेटर है जो 128-बिट राज्य प्रदान करता है।

function xoshiro128ss(a, b, c, d) {
    return function() {
        var t = b << 9, r = a * 5; r = (r << 7 | r >>> 25) * 9;
        c ^= a; d ^= b;
        b ^= c; a ^= d; c ^= t;
        d = d << 11 | d >>> 21;
        return (r >>> 0) / 4294967296;
    }
}

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

JSF (जेनकींस स्मॉल फास्ट)

यह जेस जेनकिंस (2007) द्वारा JSF या 'स्मॉलप्रेंज' है, जो उस व्यक्ति ने बनाया है जिसे ISAAC और SpookyHash बनाया गया है । यह प्रैक्ट्रैंड परीक्षण पास करता है और यह काफी तेज़ होना चाहिए, हालांकि एसएफसी जितना तेज़ नहीं।

function jsf32(a, b, c, d) {
    return function() {
        a |= 0; b |= 0; c |= 0; d |= 0;
        var t = a - (b << 27 | b >>> 5) | 0;
        a = b ^ (c << 17 | c >>> 15);
        b = c + d | 0;
        c = d + t | 0;
        d = a + t | 0;
        return (d >>> 0) / 4294967296;
    }
}

LCG (उर्फ लेहमर / पार्क-मिलर RNG या MCG)

एलसीजी बेहद तेज और सरल है, लेकिन इसकी यादृच्छिकता की गुणवत्ता इतनी कम है, कि अनुचित उपयोग वास्तव में आपके कार्यक्रम में कीड़े पैदा कर सकता है! बहरहाल, यह कुछ जवाबों का उपयोग करने के सुझाव से काफी बेहतर है Math.sinया Math.PI! यह हालांकि वन-लाइनर है, जो अच्छा है :)।

var LCG=s=>()=>(2**31-1&(s=Math.imul(48271,s)))/2**31;

इस कार्यान्वयन को न्यूनतम मानक RNG कहा जाता है, जैसा कि 1988 और 1993 में पार्क-मिलर द्वारा प्रस्तावित और C ++ 11 में लागू किया गया था minstd_rand। ध्यान रखें कि राज्य 31-बिट है (31 बिट्स 2 बिलियन संभव राज्य देते हैं, 32 बिट्स दोगुना देते हैं)। यह PRNG का बहुत ही प्रकार है जिसे अन्य बदलने का प्रयास कर रहे हैं!

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

32-बिट राज्य (राज्य-स्थान में वृद्धि) की पेशकश करने वाले अन्य गुणक प्रतीत होते हैं:

var LCG=s=>()=>(s=Math.imul(741103597,s)>>>0)/2**32;
var LCG=s=>()=>(s=Math.imul(1597334677,s)>>>0)/2**32;

ये LCG मान इस प्रकार हैं: P. L.Ecuyer: Linear Congruential Generators of विभिन्न आकारों और अच्छी जाली संरचना की एक तालिका, 30 अप्रैल 1997।


5
यह एक अद्भुत उत्तर है। मुझे यकीन है कि यह वापस आ जाएगा।
डेविडसनल

1
मेरा मानना ​​है कि पियरे L'ecuyer द्वारा "टेबल्स ऑफ़ लीनियर कंजरवेटिव जेनरेटर्स ..." से आपके द्वारा उद्धृत मूल्यों को जावास्क्रिप्ट में अधिकतम पूर्णांक आकार से अधिक हो सकता है। का अधिकतम बीज (2 ^ 32-1) * 741103597 18 3e18, जो जावास्क्रिप्ट के अधिकतम अंतर size 9e15 से अधिक है। मुझे लगता है कि पियरे की पुस्तक के निम्नलिखित मूल्य देशी सीमाओं के भीतर सबसे बड़ी अवधि है seed = (seed * 185852 + 1) % 34359738337:।
लछमनस्की

1
@Lachmanski सच है, लेकिन उन 32-बिट्स (और पार्क-मिलर 31-बिट्स) से बंधे हैं। का उपयोग करते हुए Math.imulयह के रूप में जब 32-बिट पूर्णांकों पर सी में गुणन का उपयोग यह होगा अतिप्रवाह कर सकते हैं। आप जो सुझाव दे रहे हैं वह जेएस के पूर्णांक स्थान की पूरी श्रृंखला का उपयोग करने वाला एक एलसीजी है, जो निश्चित रूप से एक दिलचस्प क्षेत्र है। :)
bryc

1
यह कमाल का है! क्या मैं आपके sfc32 को LGPL प्रोग्राम में कॉपी कर सकता हूँ?
user334639

4
@ blobber2 यह सुनिश्चित नहीं करता है कि आपका क्या मतलब है, लेकिन मूल कोड यहाँ से (दूसरों के साथ) है: github.com/bryc/code/blob/master/jshash/PRNGs.md । अधिक या कम एक भंडार के अंदर एक
मुट्ठी

39

नहीं, लेकिन यहां एक साधारण छद्म आयामी जनरेटर है, जिसे मैं बहु विकिपीडिया से अनुकूलित किया गया है ( जिसे तब से हटा दिया गया है) का कार्यान्वयन

var m_w = 123456789;
var m_z = 987654321;
var mask = 0xffffffff;

// Takes any integer
function seed(i) {
    m_w = (123456789 + i) & mask;
    m_z = (987654321 - i) & mask;
}

// Returns number between 0 (inclusive) and 1.0 (exclusive),
// just like Math.random().
function random()
{
    m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
    m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;
    var result = ((m_z << 16) + (m_w & 65535)) >>> 0;
    result /= 4294967296;
    return result;
}

EDIT: फिक्स्ड सीड फंक्शन इसे रीसेट करके m_z
EDIT2: गंभीर कार्यान्वयन दोषों को ठीक कर दिया गया है


3
क्या किसी ने इस समारोह को इसकी यादृच्छिकता के लिए परीक्षण किया है?
जस्टिन

3
यह एक सुंदर लंबी अवधि के साथ बहु-कैरी (MWC) यादृच्छिक जनरेटर है। विकिपीडिया रैंडम नंबर
माइकल_शर्फ़

10
seedसमारोह, यादृच्छिक जनरेटर रीसेट नहीं है क्योंकि mz_zचर जब बदल जाता है random()कहा जाता है। इसलिए सेट करें mz_z = 987654321(या कोई अन्य मूल्य)seed
माइकल_शर्फ

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

@ मिचेल_शर्फ 1) बीज परिवर्तन m_w , नहीं m_z। 2) दोनों m_wऔर m_zकर रहे हैं परिवर्तन उनके पिछले मूल्यों पर आधारित है, इसलिए यह परिणाम को संशोधित करता है।
ईएसएल

26

एंट्टी साइकिरी का एल्गोरिदम अच्छा और छोटा है। जब मैंने Math.seed (s) को कॉल किया तो मैंने शुरू में एक बदलाव किया, जिसने जावास्क्रिप्ट के Math.random को बदल दिया, लेकिन तब जेसन ने टिप्पणी की कि फ़ंक्शन को वापस करना बेहतर होगा:

Math.seed = function(s) {
    return function() {
        s = Math.sin(s) * 10000; return s - Math.floor(s);
    };
};

// usage:
var random1 = Math.seed(42);
var random2 = Math.seed(random1());
Math.random = Math.seed(random2());

यह आपको एक और कार्यक्षमता देता है जो जावास्क्रिप्ट में नहीं है: कई स्वतंत्र यादृच्छिक जनरेटर। यह विशेष रूप से महत्वपूर्ण है यदि आप एक ही समय में कई बार दोहराए जाने वाले अनुकरण करना चाहते हैं।


3
यदि आप सेटिंग के बजाय फ़ंक्शन को वापस करते हैं जो Math.randomआपको कई स्वतंत्र जनरेटर बनाने की अनुमति देगा, है ना?
जेसन गोएमाट

1
यादृच्छिकता के वितरण के बारे में उपरोक्त टिप्पणियां देखना सुनिश्चित करें यदि यह आपके लिए मायने रखता है: stackoverflow.com/questions/521295/…
jocull

इससे उत्पन्न होने वाली रंडियों को कैसे दोहराया जा सकता है? यह हर बार नए नंबर देता रहता है
SMUsamaShah

हर बार जब आप Math.seed(42);इसे करते हैं, तो यह फ़ंक्शन को रीसेट करता है, इसलिए यदि आप करते var random = Math.seed(42); random(); random();हैं 0.70..., तो 0.38...। यदि आप इसे var random = Math.seed(42);फिर से कॉल करके रीसेट करते हैं , तो अगली बार जब आप कॉल random()करेंगे तो आप 0.70...फिर से मिलेंगे, और अगली बार जब आप दोबारा कॉल करेंगे 0.38...
18

1
कृपया इसका उपयोग न करें। कृपया randomएक देशी जावास्क्रिप्ट फ़ंक्शन को अधिलेखित करने के बजाय एक स्थानीय चर का उपयोग करने के लिए समय निकालें। ओवरराइटिंग Math.randomJist संकलक अपने सभी कोड unoptimize हो सकती है।
जैक गिफिन

11

कृपया पियरे L'Ecuyer का काम 1980 के दशक के अंत में और 1990 के दशक की शुरुआत में देखें। वहां अन्य लोग भी हैं। यदि आप विशेषज्ञ नहीं हैं, तो अपने दम पर एक यादृच्छिक संख्या में जनरेटर (छद्म) का निर्माण करना बहुत खतरनाक है, क्योंकि या तो परिणामों की एक उच्च संभावना है कि परिणाम सांख्यिकीय रूप से यादृच्छिक नहीं हैं या एक छोटी अवधि होने में हैं। पियरे (और अन्य) ने कुछ अच्छे (छद्म) यादृच्छिक संख्या जनरेटर को एक साथ रखा है जिन्हें लागू करना आसान है। मैं उनके LFSR जनरेटर में से एक का उपयोग करता हूं।

https://www.iro.umontreal.ca/~lecuyer/myftp/papers/handstat.pdf

फिल ट्रॉय


1
शानदार उत्तर, लेकिन जावास्क्रिप्ट से संबंधित नहीं :)
निकोले फोमिनीह

3
प्रोफेसर L'Ecuyer के काम को लागू करने के लिए कोड सार्वजनिक रूप से जावा और अधिकांश प्रोग्रामर द्वारा जावास्क्रिप्ट में आसानी से अनुवाद योग्य है।
user2383235

6

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

Math.seed = function(s) {
    var mask = 0xffffffff;
    var m_w  = (123456789 + s) & mask;
    var m_z  = (987654321 - s) & mask;

    return function() {
      m_z = (36969 * (m_z & 65535) + (m_z >>> 16)) & mask;
      m_w = (18000 * (m_w & 65535) + (m_w >>> 16)) & mask;

      var result = ((m_z << 16) + (m_w & 65535)) >>> 0;
      result /= 4294967296;
      return result;
    }
}

var myRandomFunction = Math.seed(1234);
var randomNumber = myRandomFunction();

4
यह विभिन्न बीजों के साथ अनुक्रम की शुरुआत में बहुत समान परिणाम उत्पन्न करता है। उदाहरण के लिए, Math.seed(0)()रिटर्न 0.2322845458984375, और Math.seed(1)()रिटर्न 0.23228873685002327। बीज के अनुसार m_wऔर परिवर्तन दोनों में m_zमदद मिलती है। var m_w = 987654321 + s; var m_z = 123456789 - s;विभिन्न बीजों के साथ पहले मूल्यों का अच्छा वितरण करता है।
अपरिभाषित

1
@ आपके द्वारा बताई गई समस्या को अंतिम संपादन के रूप में तय किया गया है, यह MWC कार्यान्वयन में एक बग था।
17:22 बजे

जनवरी 2020 तक अच्छी तरह से काम कर रहे हैं। 0 के साथ बीज, 0.7322976540308446 प्राप्त करें। 1 के साथ बीज, 0.16818441334180534, 2 के साथ: 0.6040864314418286, 3 के साथ: 0.03998844954185188। तुम दोनों को धन्यवाद!
यूरेका

3

अपने खुद के छद्म यादृच्छिक जनरेटर लिखने के लिए काफी सरल है।

डेव स्कॉटीज़ का सुझाव उपयोगी है, लेकिन जैसा कि दूसरों द्वारा बताया गया है, यह काफी समान रूप से वितरित नहीं है।

हालाँकि, यह पाप के पूर्णांक तर्कों के कारण नहीं है। यह केवल पाप की सीमा के कारण है, जो एक वृत्त का एक आयामी प्रक्षेपण होता है। यदि आप इसके बजाय वृत्त का कोण लेंगे तो यह एक समान होगा।

इसलिए पाप (x) के बजाय arg (exp (i * x)) / (2 * PI) का उपयोग करें।

यदि आपको रेखीय क्रम पसंद नहीं है, तो इसे थोड़ा सा एक्सोर के साथ मिलाएं। वास्तविक कारक उतना मायने नहीं रखता है।

N छद्म यादृच्छिक संख्या उत्पन्न करने के लिए कोई कोड का उपयोग कर सकता है:

function psora(k, n) {
  var r = Math.PI * (k ^ n)
  return r - Math.floor(r)
}
n = 42; for(k = 0; k < n; k++) console.log(psora(k, n))

कृपया ध्यान दें कि असली एंट्रॉपी की आवश्यकता होने पर आप छद्म यादृच्छिक अनुक्रमों का उपयोग नहीं कर सकते हैं।


मैं कोई विशेषज्ञ नहीं हूं, लेकिन अनुक्रमिक बीज एक का पालन करते हैं निरंतर पैटर्न । रंगीन पिक्सेल हैं> = 0.5। मैं इसके त्रिज्या के ऊपर और उसके बारे में अनुमान लगा रहा हूँ?
मारक 6'17


1

Math.randomनहीं, लेकिन भागा पुस्तकालय इसे हल करता है। इसमें लगभग सभी वितरण हैं जिनकी आप कल्पना कर सकते हैं और वरीयता प्राप्त यादृच्छिक संख्या का समर्थन कर सकते हैं। उदाहरण:

ran.core.seed(0)
myDist = new ran.Dist.Uniform(0, 1)
samples = myDist.sample(1000)

-1

मैंने एक फ़ंक्शन लिखा है जो एक बीजयुक्त यादृच्छिक संख्या देता है, यह Math.sin का उपयोग एक लंबे यादृच्छिक संख्या में करता है और उस से संख्या लेने के लिए बीज का उपयोग करता है।

उपयोग :

seedRandom("k9]:2@", 15)

यह आपके वरीयता प्राप्त नंबर को वापस करेगा पहला पैरामीटर किसी भी स्ट्रिंग मान है; आपका बीज। दूसरा पैरामीटर है कि कितने अंक वापस आएंगे।

     function seedRandom(inputSeed, lengthOfNumber){

           var output = "";
           var seed = inputSeed.toString();
           var newSeed = 0;
           var characterArray = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','y','x','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','U','R','S','T','U','V','W','X','Y','Z','!','@','#','$','%','^','&','*','(',')',' ','[','{',']','}','|',';',':',"'",',','<','.','>','/','?','`','~','-','_','=','+'];
           var longNum = "";
           var counter = 0;
           var accumulator = 0;

           for(var i = 0; i < seed.length; i++){
                var a = seed.length - (i+1);
                for(var x = 0; x < characterArray.length; x++){
                     var tempX = x.toString();
                     var lastDigit = tempX.charAt(tempX.length-1);
                     var xOutput = parseInt(lastDigit);
                     addToSeed(characterArray[x], xOutput, a, i); 
                }                  
           }

                function addToSeed(character, value, a, i){
                     if(seed.charAt(i) === character){newSeed = newSeed + value * Math.pow(10, a)}
                }
                newSeed = newSeed.toString();

                var copy = newSeed;
           for(var i=0; i<lengthOfNumber*9; i++){
                newSeed = newSeed + copy;
                var x = Math.sin(20982+(i)) * 10000;
                var y = Math.floor((x - Math.floor(x))*10);
                longNum = longNum + y.toString()
           }

           for(var i=0; i<lengthOfNumber; i++){
                output = output + longNum.charAt(accumulator);
                counter++;
                accumulator = accumulator + parseInt(newSeed.charAt(counter));
           }
           return(output)
      }

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


-6

0 और 100 के बीच की संख्या के लिए।

Number.parseInt(Math.floor(Math.random() * 100))

3
इस Math.randomतरह के बीजारोपण के बारे में सवाल यह है कि जब भी Math.randomएक ही बीज के साथ बीज डाला जाता है, तो यह क्रमिक संख्याओं की क्रमिक श्रृंखला का उत्पादन करेगा। यह प्रश्न, प्रति कहना, वास्तविक उपयोग / प्रदर्शन के बारे में नहीं है Math.random
जैक गिफिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.