الـgenerator الشبه عشوائي
هناك مواطن كثيرة حيث نحتاج إلى بيانات عشوائية.
واحدة منها هي الإختبار (testing). يمكن أن نحتاج إلى بيانات عشوائية: نصوص أو أرقام وهكذا لاختبار الأشياء جيدّا.
في جافا سكريبت يمكننا استخدام Math.random()
ولكن إذا حدث أى خطأ فإننا يمكن أن نود أن نعيد الإختبار باستخدام نفس البيانات.
من أجل ذلك نستخدم ما يسمي “seeded pseudo-random generators” فهي تأخذ بذرة “seed” كمتغير أول وتقوم بإنشاء القيم التالية باستخدام معادلة ولذلك فإن البذرة نفسها تظل فى نفس التتابع ويمكن تكرار نفس الخطوات بسهولة. نحتاج فقط أن نتذكر الذرة لتكرارها.
مثال على هذه المعادلة والتى تقوم بإنشاء قيم:
next = previous * 16807 % 2147483647
إذا استخدمنا 1
كبذرة فإن القيم ستكون:
16807
282475249
1622650073
- …وهكذا…
المهمة تقتضي أن تنشئ دالة generator pseudoRandom(seed)
والتى تأخذ seed
وتنشئ الـgenerator بهذه المعادلة.
مثال على استخدامها:
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;
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 وهذا يمكن أن يكون مفيدًا فى مكان ما.