বীজযোগ্য জাভাস্ক্রিপ্ট এলোমেলো নম্বর জেনারেটর


149

জাভাস্ক্রিপ্ট Math.random()ফাংশনটি 0 এবং 1 এর মধ্যে একটি এলোমেলো মান প্রদান করে, বর্তমান সময়ের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে বীজযুক্ত (জাভা যা আমি বিশ্বাস করি তেমন)। তবে আমি মনে করি না যে এর জন্য আপনাকে নিজের বীজ সেট করার কোনও উপায় নেই।

আমি কীভাবে একটি এলোমেলো সংখ্যার জেনারেটর তৈরি করতে পারি যার জন্য আমি নিজের বীজের মূল্য প্রদান করতে পারি, যাতে আমি এটির (সিউডো) এলোমেলো সংখ্যার পুনরাবৃত্তিযোগ্য ক্রম উত্পাদন করতে পারি?


1
দ্রষ্টব্য: এই প্রশ্নটি সংক্ষিপ্ত এবং কেন্দ্রীভূত রাখার স্বার্থে, আমি উপরের প্রশ্নে থাকা কোডটি নীচে একটি সম্প্রদায়ের উইকি উত্তরটিতে বিভক্ত করেছি ।
ইলমারি করোনেন

1
আরও দেখুন stackoverflow.com/questions/521295
Palimondo

উত্তর:


123

একটি বিকল্প হ'ল http://davidbau.com/seedrandom যা একটি বীজযোগ্য আরসি 4-ভিত্তিক ম্যাথ.রেন্ডম () ড্রপ-ইন প্রতিস্থাপনের সাথে দুর্দান্ত বৈশিষ্ট্য।


18
ডেভিড বাউ এর বীজতলা থেকে যথেষ্ট জনপ্রিয় হয়ে উঠেছে যে তিনি এটি এখানে গিথুবে বজায় রেখেছেন । এটি একটি লজ্জার বিষয় যে ECMAScript এতদিন ধরে এমন দৃশ্যের মুখোমুখি হয়েছে যে এর মতো জিনিসগুলি ভাষার অন্তর্ভুক্ত নয়। সিরিয়াসলি, কোন বীজ নেই !!!
জোসে

2
@ আইটজোস, জেএসের লজ্জা এবং গৌরব উভয়ই এটি প্রয়োজনীয় এবং সম্ভব উভয়ই। এটি বেশ দুর্দান্ত যে আপনি একটি ফাইল অন্তর্ভুক্ত করতে পারেন এবং ম্যাথ অবজেক্টের সাথে সামঞ্জস্যপূর্ণ পরিবর্তনগুলি করতে পারেন। 10 দিনের কাজের জন্য খারাপ নয়, ব্রেন্ডন আইচ।
ব্রুনো ব্রোনোস্কি

2
: এই প্রকল্পের জন্য npm পৃষ্ঠার জন্য খুঁজছেন যে কেউ জন্য npmjs.com/package/seedrandom
কিপ

27

আপনার যদি বীজ ক্ষমতার প্রয়োজন না হয় কেবল তার Math.random()চারপাশে সহায়ক ফাংশনগুলি ব্যবহার করুন এবং তৈরি করুন (উদাঃ randRange(start, end))।

আপনি কী আরএনজি ব্যবহার করছেন তা আমি নিশ্চিত নই তবে এটিকে জানার এবং নথিভুক্ত করা ভাল best যাতে আপনি এর বৈশিষ্ট্য এবং সীমাবদ্ধতা সম্পর্কে অবগত হন।

যেমন স্টারকিই বলেছিলেন, মার্সেন টুইস্টার একটি ভাল পিআরএনজি, তবে এটি কার্যকর করা সহজ নয়। আপনি যদি এটি করতে চান তবে নিজেই একটি এলসিজি বাস্তবায়নের চেষ্টা করুন - এটি খুব সহজ, শালীন এলোমেলো গুণ আছে (মার্সেন টুইস্টার হিসাবে ভাল নয়), এবং আপনি কয়েকটি জনপ্রিয় ধ্রুবক ব্যবহার করতে পারেন।

সম্পাদনা: এলসিজি বিকল্প সহ সংক্ষিপ্ত বীজযুক্ত আরএনজি বাস্তবায়নের জন্য এই উত্তরের দুর্দান্ত বিকল্পগুলি বিবেচনা করুন ।

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));


2
মডুলাসটি 2 ^ 31 হওয়া উচিত নয়? আমি উইকি থেকে এই অ্যালগরিদমটি পড়েছি ।
ট্র্যান্টর লিউ

3
ঠিক তাই আপনি সচেতন, এটি "সঠিক" এই অর্থে নয় যে এটি গণিতের নির্দেশ অনুসারে ফলাফল দেয় না। অন্য কথায়, যে ভাষা সেই বৃহত সংখ্যককে পরিচালনা করতে পারে তার আলাদা ফলাফল হবে। জেএস বড় সংখ্যা এবং চপস নির্ভুলতার উপরে চাপ দেয় (তারা সর্বোপরি ভাসমান)।
ডিডিএস

4
-1 এই এলসিজি বাস্তবায়ন জাভাস্ক্রিপ্টে নির্ভুল পূর্ণসংখ্যার সীমাটি ব্যস করে কারণ this.a * this.stateফলাফলটি 2 ^ 53 এর চেয়ে বেশি সংখ্যক হতে পারে। ফলাফলটি একটি সীমিত আউটপুট পরিসর এবং কিছু বীজের জন্য সম্ভবত খুব অল্প সময়ের জন্য। সাধারণভাবে দুটি শক্তির ব্যবহারের mফলে কিছু চমত্কার সুস্পষ্ট নিদর্শনগুলির ফলাফল হয়, আপনি যখন কোনও উপায় কাটানোর পরিবর্তে কোনও মডুলাস অপারেশন ব্যয় করছেন তবে কোনও প্রাইম ব্যবহার না করার কোনও কারণ নেই।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

22

আপনি যদি বীজ নির্দিষ্ট করতে সক্ষম হতে চান তবে আপনাকে কেবল কলগুলি getSeconds()এবং এর প্রতিস্থাপন করতে হবে getMinutes()। আপনি কোনও ইনট্রিতে পাস করতে পারেন এবং এটির অর্ধেকটি সেকেন্ড মানের জন্য 60 এবং অন্য অর্ধটি মডুলো 60 ব্যবহার করার জন্য আপনাকে অন্য অংশটি দিতে পারেন।

বলা হচ্ছে, এই পদ্ধতিটি আবর্জনার মতো দেখাচ্ছে। যথাযথ র্যান্ডম সংখ্যা জেনারেশন করা খুব কঠিন। এর সাথে সুস্পষ্ট সমস্যাটি হ'ল এলোমেলো সংখ্যা বীজ সেকেন্ড এবং মিনিটের উপর ভিত্তি করে। বীজ অনুমান করতে এবং এলোমেলো সংখ্যার আপনার স্ট্রিমটি পুনরায় তৈরি করতে কেবল 3600 বিভিন্ন দ্বিতীয় এবং মিনিটের সংমিশ্রণের চেষ্টা করতে হবে। এর অর্থ হ'ল এখানে সম্ভাব্য বীজ রয়েছে মাত্র 3600। এটি সংশোধনযোগ্য, তবে আমি শুরু থেকেই এই আরএনজি সম্পর্কে সন্দেহজনক be

আপনি যদি আরও ভাল আরএনজি ব্যবহার করতে চান তবে মার্সেন টুইস্টার ব্যবহার করে দেখুন । এটি একটি দুর্দান্ত পরীক্ষার এবং দুর্দান্ত পারফরম্যান্স সহ একটি ভাল পরীক্ষিত এবং মোটামুটি শক্তিশালী আরএনজি।

সম্পাদনা: আমার সত্যই সঠিক হওয়া উচিত এবং এটিকে সিউডো র্যান্ডম নম্বর জেনারেটর বা পিআরএনজি হিসাবে উল্লেখ করুন।

"যে কেউ এলোমেলো সংখ্যা তৈরির জন্য পাটিগণিত পদ্ধতি ব্যবহার করে, সে পাপের অবস্থায় রয়েছে" "
                                                                                                                                                          --- জন ভন নিউমান


1
Mersenne প্রতারক এর জাতীয় বাস্তবায়নের একটি লিঙ্ক: math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/JAVASCRIPT/...
orip

1
@orip 3600 প্রারম্ভিক রাজ্যের জন্য আপনার কি কোনও উত্স আছে? মার্সেন টুইস্টার 32 বিট সংখ্যার দ্বারা বীজযুক্ত, তাই পিআরএনজির 4 বিলিয়ন প্রাথমিক রাজ্য থাকা উচিত - কেবলমাত্র যদি প্রাথমিক বীজ সত্যই এলোমেলো হয়।
টোবিয়াস পি।

2
@TobiasP। আমি getSecond () এবং getMinutes (), 60 * 60 == 3600 সম্ভাব্য প্রাথমিক অবস্থার সংমিশ্রণ সহ বীজের পরামর্শটি উল্লেখ করছিলাম। আমি মার্সেন টুইস্টারকে উল্লেখ করছি না।
অরিপ

3
@ ইউরিপ ঠিক আছে, পরিষ্কার ছিল না। আপনি মার্সেন টুইস্টারকে নিয়েছিলেন এবং পরবর্তী বাক্যটিতে আঞ্চলিক রাজ্য সম্পর্কে;)
টোবিয়াস পি।

2
প্রশ্নকর্তা কোনও ধরণের ক্রিপ্টোগ্রাফিক সংবেদনশীল অ্যাপ্লিকেশনটির জন্য তাদের "যথাযথ" এলোমেলো সংখ্যা জেনারেশন প্রয়োজন তা উল্লেখ করেন না। উত্তরগুলির সমস্ত সত্য হলেও, কেবলমাত্র প্রথম অনুচ্ছেদটি জিজ্ঞাসিত প্রশ্নের সাথে সম্পর্কিত। সম্ভবত প্রস্তাবিত সমাধানটির একটি কোড স্নিপেট যুক্ত করুন।
ভি রুবিনেটি

12

আমি মার্সেন টুইস্টার এর একটি জাভাস্ক্রিপ্ট পোর্ট ব্যবহার করি: https://gist.github.com/300494 এটি আপনাকে ম্যানুয়ালি বীজ সেট করতে দেয়। এছাড়াও, অন্যান্য উত্তরে উল্লিখিত হিসাবে, মার্সেন টুইস্টার সত্যিই একটি ভাল পিআরএনজি।


8

আপনি যে ধরণের তালিকাভুক্ত কোডটি লেহমার আরএনজির মতো দেখায় । যদি এটি হয় তবে 2147483647বৃহত্তম 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা, 2147483647বৃহত্তম 32-বিট প্রাইম এবং 48271এটি একটি পূর্ণ-সময়ক গুণক যা সংখ্যা তৈরি করতে ব্যবহৃত হয়।

যদি এটি সত্য RandomNumberGeneratorহয় তবে আপনি একটি অতিরিক্ত প্যারামিটার নিতে পরিবর্তন করতে পারেন seedএবং তারপরে সেট this.seedকরতে পারেন seed; তবে আপনাকে অবশ্যই নিশ্চিত হতে হবে যে বীজটি এলোমেলো সংখ্যার একটি ভাল বিতরণ করবে (লেহমারের মতো অদ্ভুত হতে পারে) - তবে বেশিরভাগ বীজ ভাল থাকবে।


7

নিম্নলিখিতটি একটি PRNG যা একটি কাস্টম বীজ খাওয়ানো হতে পারে। কলিং SeedRandomএলোমেলো জেনারেটরের ফাংশন ফিরিয়ে দেবে। SeedRandomবর্তমান সময়ের সাথে ফিরে আসা এলোমেলো ক্রিয়াকলাপটি বদ্ধ করতে কোনও যুক্তি ছাড়াই বলা যেতে পারে, বা এটি পূর্ণসংখ্যার সাথে বীজ বজায় রাখার জন্য এটি 1 বা 2 অ-নেতিবাচক ছেদ যুক্ত দ্বারা যুক্ত করা যেতে পারে। শুধুমাত্র 1 মান সহ ফ্লোট পয়েন্ট যথার্থতার জন্য বীজ কেবল জেনারেটরটিকে 2 ^ 53 বিভিন্ন রাজ্যের মধ্যে একটিতে আরম্ভ করার অনুমতি দেবে।

প্রত্যাবর্তিত এলোমেলো জেনারেটরের limitফাংশনটিতে 1 টি পূর্ণসংখ্যার যুক্তি যুক্ত হয় , সীমাটি 1 থেকে 4294965886 এর মধ্যে হতে হবে, ফাংশনটি 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 of 63 পিরিয়ড রয়েছে, যা জাভাস্ক্রিপ্ট প্রোগ্রামে বাস্তবের প্রয়োজন পড়ার চেয়ে অনেক বেশি।
  • modমানগুলি প্রাইম হওয়ার কারণে আউটপুটে কোনও সাধারণ প্যাটার্ন নেই, নির্বাচিত সীমাটি বিবেচনা করেই। এটি কিছু সহজ PRNGs এর বিপরীতে যা কিছু বেশ নিয়মিত পদ্ধতিতে প্রদর্শিত হয়।
  • সীমা নির্বিশেষে নিখুঁত বন্টন পেতে এটি কিছু ফলাফল বাতিল করে দেয়।
  • এটি তুলনামূলকভাবে ধীরে ধীরে, আমার মেশিনে প্রতি সেকেন্ডে 10 000 000 বার চালায়।

2
কেন এটি একটি প্যাটার্ন উত্পাদন করে? for (var i = 0; i < 400; i++) { console.log("input: (" + i * 245 + ", " + i * 553 + ") | output: " + SeedRandom(i * 245, i * 553)(20)); }
টিমোথি কানস্কি

পছন্দ করেছেন আমি কোনও বিশেষজ্ঞ নই তবে এটি ঘটে কারণ আপনি প্রতিটি পুনরাবৃত্তিতে জেনারেটর শুরু করছেন, কেবল বীজের উপর ভিত্তি করে এর প্রথম মানটি দেখছেন, এবং জেনারেটরের পরবর্তী সংখ্যায় পুনরাবৃত্তি করছেন না। আমি বিশ্বাস করি যে নির্দিষ্ট বিরতিতে বীজ হ্যাশ করে না এমন কোনও পিআরএনজিতে এটি ঘটবে।
ব্রাইক

5

আপনি যদি টাইপস্ক্রিপ্টে প্রোগ্রাম করেন তবে আমি মরসেন টুইস্টার বাস্তবায়নটিকে ক্রিস্টফ হেন্কেলম্যানের এই থ্রেডের জবাবকে টাইপ স্ক্রিপ্ট শ্রেণিতে রূপায়িত করেছি:

/**
 * 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 w-r 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 a a pseudo random number in range [0,1]

আরও পদ্ধতির জন্য উত্স পরীক্ষা করুন।


0

দ্রষ্টব্য: এই কোডটি মূলত উপরের প্রশ্নের মধ্যে অন্তর্ভুক্ত ছিল। প্রশ্নটি সংক্ষিপ্ত ও কেন্দ্রীভূত রাখার স্বার্থে, আমি এটিকে এই সম্প্রদায় উইকি উত্তরের দিকে নিয়ে গিয়েছি।

আমি এই কোডটি চারদিকে লাথি মেরে পেয়েছি এবং এলোমেলো নম্বর পাওয়ার জন্য এবং পরে বীজটি ব্যবহার করার জন্য এটি দুর্দান্ত কাজ করেছে বলে মনে হচ্ছে তবে যুক্তিটি কীভাবে কাজ করে তা আমি নিশ্চিত নই (যেমন 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.
*/

3
বাহ, কার্যগুলি RandomNumberGeneratorএবং nextRandomNumberফাংশনগুলি আসলে 1996 সালের দিকে সমস্ত তারিখের date এটি লেহমার / এলসিজি আরএনজি হওয়ার কথা। এটি 32 বিট পূর্ণসংখ্যার মডুলো গাণিতিক সম্পাদন করতে কিছু চালাক গণিত ব্যবহার করে যা কিছুটা মধ্যবর্তী মানগুলি সংযোজন করতে খুব কম হবে। জিনিসটি হ'ল, জাভাস্ক্রিপ্ট 32 বিট পূর্ণসংখ্যার প্রয়োগ করে না, বরং 64 বিট ভাসমান, এবং যেহেতু বিভাগটি এই কোডের মতো পূর্ণসংখ্যা বিভাগ নয় ফলাফল অনুমান করে যে কোনও লেহমারের জেনারেটর নয়। এটি এলোমেলো মনে হচ্ছে এমন কিছু ফলাফল তৈরি করে, তবে লেহমারের জেনারেটরের গ্যারান্টি প্রযোজ্য নয়।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

1
createRandomNumberফাংশন পরবর্তী উপরন্তু, এটা প্রায় কাছাকাছি সবকিছু ভুল মধ্যে উল্লেখযোগ্য এটি একটি নতুন RNG প্রত্যেক সময় এটা বলা হয়, যার মানে দ্রুত পারম্পর্য মধ্যে কল সব একই ভাসা ব্যবহার করবে instantiates আছে। প্রদত্ত কোডে এবং এর 'a'সাথে অন্য কিছু যুক্ত করা প্রায় অসম্ভব । '1''red'
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

-2

ঠিক আছে, আমি সমাধান স্থিতি এখানে।

প্রথমে আপনি "newseed ()" ফাংশন ব্যবহার করে একটি বীজ মান তৈরি করুন। তারপরে আপনি "শ্রেনডম ()" ফাংশনে বীজ মানটি পাস করুন। শেষ অবধি, "শ্রেনডম ()" ফাংশনটি 0 এবং 1 এর মধ্যে একটি সিউডো এলোমেলো মান প্রদান করে।

গুরুত্বপূর্ণ বিটটি হ'ল বীজের মান একটি অ্যারের ভিতরে সংরক্ষণ করা হয়। যদি এটি কেবল একটি পূর্ণসংখ্যা বা ভাসা ছিল, প্রতিটি সময় ফাংশনটি যখন ডাকা হত তখন মানটি ওভাররাইট হয়ে যেত, যেহেতু পূর্ণসংখ্যা, ভাসা, স্ট্রিং এবং এর জাতীয় মানগুলি স্ট্যাকের মধ্যে সরাসরি পয়েন্টারগুলিতে সরাসরি অ্যারেগুলির ক্ষেত্রে সংরক্ষণ করা হয় এবং অন্যান্য বস্তু। সুতরাং, বীজের মূল্য অবিচল থাকা সম্ভব।

অবশেষে, "শ্রেনডম ()" ফাংশনটি এমনভাবে সংজ্ঞায়িত করা সম্ভব যে এটি "ম্যাথ" অবজেক্টের একটি পদ্ধতি, তবে আমি এটি আপনার কাছে রেখে দেব। ;)

শুভকামনা!

javascript:

// 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)

পিএস - আমি স্ট্যাক ওভারফ্লোয়ের সাথে এখনও তেমন পরিচিত নই, তবে পোস্টগুলি কালানুক্রমিক ক্রমে নয় কেন?
পোস্টফ্যান 12

হাই @ পজফ্যান 12 - প্রশ্নের উত্তরগুলি সাধারণত "আপভোটস" দ্বারা "ক্রিম শীর্ষে উঠে যায়" অনুসারে তালিকাভুক্ত হয়। তবে একই স্কোর সহ উত্তরগুলি সুষ্ঠুভাবে দেখার জন্য, এগুলি এলোমেলো ক্রমে দেখানো হয়েছে। যেহেতু মূলত এটি আমার প্রশ্ন ;-) আমি অবশ্যই খুব শীঘ্রই এটি পরীক্ষা করে দেখব। যদি আমি (বা অন্যরা) এই উত্তরটিকে সহায়ক মনে করি তবে আমরা এটির উন্নতি করব এবং যদি আমি এটি "সঠিক" উত্তর বলে মনে করি তবে আপনি এই উত্তরে একটি সবুজ চেকমার্কও যুক্ত দেখতে পাবেন। - স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম!
স্কানলিফ

2
-1 এই এলসিজি বাস্তবায়ন জাভাস্ক্রিপ্টে নির্ভুল পূর্ণসংখ্যার সীমাটি ব্যস করে কারণ seedobj[0] * seedobjaফলাফলটি 2 ^ 53 এর চেয়ে বেশি সংখ্যক হতে পারে। ফলাফলটি একটি সীমিত আউটপুট পরিসর এবং কিছু বীজের জন্য সম্ভবত খুব অল্প সময়ের জন্য।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.