الرجوع الي الدرس

الـgenerator الشبه عشوائي

هناك مواطن كثيرة حيث نحتاج إلى بيانات عشوائية.

واحدة منها هي الإختبار (testing). يمكن أن نحتاج إلى بيانات عشوائية: نصوص أو أرقام وهكذا لاختبار الأشياء جيدّا.

في جافا سكريبت يمكننا استخدام Math.random() ولكن إذا حدث أى خطأ فإننا يمكن أن نود أن نعيد الإختبار باستخدام نفس البيانات.

من أجل ذلك نستخدم ما يسمي “seeded pseudo-random generators” فهي تأخذ بذرة “seed” كمتغير أول وتقوم بإنشاء القيم التالية باستخدام معادلة ولذلك فإن البذرة نفسها تظل فى نفس التتابع ويمكن تكرار نفس الخطوات بسهولة. نحتاج فقط أن نتذكر الذرة لتكرارها.

مثال على هذه المعادلة والتى تقوم بإنشاء قيم:

next = previous * 16807 % 2147483647

إذا استخدمنا 1 كبذرة فإن القيم ستكون:

  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

وهذا يعمل أيضًا ولكن فقدنا الإمكانية أن نكرر باستخدام التكرار for..of واستخدام تكوين الـgenerator وهذا يمكن أن يكون مفيدًا فى مكان ما.

افتح الحل الإختبارات في sandbox.