بازگشت به درس

generator شبه تصادفی

سناریوهای زیادی وجود دارند که در آن به دیتای تصادفی نیاز است.

یکی از آن‌ها تست کردن است. ممکن است ما برای یک تست خوب به دیتای تصادفی نیاز داشته باشیم: متن، عدد و غیره.

در جاوااسکریپت می‌توان از ()Math.random استفاده کرد. ولی می‌خواهیم این قابلیت را داشته باشیم که تست را دقیقا با همان دیتا بتوانیم تکرار کنیم.

برای این منظور “seeded pseudo-random generators” (generatorهای شبه تصادفی با یک هسته اولیه) استفاده می‌شوند. این generatorها یک “seed” -مقدار اولیه- را می‌گیرند و طبق یک فرمول باقی دنباله را تولید می‌کنند. در نتیجه “seed” یکسان دنباله یکسانی را تولید می‌کند و کل دنباله را به راحتی می‌توان بازتولید کرد. فقط نیاز است “seed” را به یاد داشته باشیم.

یک مثال از چنین فرمولی که مقادیری با توزیع تقریبا یکنواخت تولید می‌کند:

next = previous * 16807 % 2147483647

اگر از 1 به عنوان “seed” استفاده کنیم دنباله به شکل زیر خواهد بود:

  1. 16807
  2. 282475249
  3. 1622650073
  4. …و به همین ترتیب ادامه می‌یابد…

تسک، ساختن یک تابع generator با نام pseudoRandom(seed) است که یک “seed” می‌گیرد و یک generator با فرمول داده شده می‌سازد.

مثلا:

let generator = pseudoRandom(1);

alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073

باز کردن یک sandbox همراه با تست‌ها.

function* pseudoRandom(seed) {
  let value = seed;

  while(true) {
    value = value * 16807 % 2147483647;
    yield value;
  }

};

let generator = pseudoRandom(1);

alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073

توجه داشته باشید که این کار را با توابع عادی هم می‌توان انجام داد:

function pseudoRandom(seed) {
  let value = seed;

  return function() {
    value = value * 16807 % 2147483647;
    return value;
  }
}

let generator = pseudoRandom(1);

alert(generator()); // 16807
alert(generator()); // 282475249
alert(generator()); // 1622650073

این گونه هم کار می‌کند. منتها قابلیت iterate کردن با for..of و generator composition از دست می‌رود که ممکن است جای دیگری مفید باشند.

باز کردن راه‌حل همراه با تست‌ها درون یک sandbox.