generator شبه تصادفی
سناریوهای زیادی وجود دارند که در آن به دیتای تصادفی نیاز است.
یکی از آنها تست کردن است. ممکن است ما برای یک تست خوب به دیتای تصادفی نیاز داشته باشیم: متن، عدد و غیره.
در جاوااسکریپت میتوان از ()Math.random
استفاده کرد. ولی میخواهیم این قابلیت را داشته باشیم که تست را دقیقا با همان دیتا بتوانیم تکرار کنیم.
برای این منظور “seeded pseudo-random generators” (generatorهای شبه تصادفی با یک هسته اولیه) استفاده میشوند. این generatorها یک “seed” -مقدار اولیه- را میگیرند و طبق یک فرمول باقی دنباله را تولید میکنند. در نتیجه “seed” یکسان دنباله یکسانی را تولید میکند و کل دنباله را به راحتی میتوان بازتولید کرد. فقط نیاز است “seed” را به یاد داشته باشیم.
یک مثال از چنین فرمولی که مقادیری با توزیع تقریبا یکنواخت تولید میکند:
next = previous * 16807 % 2147483647
اگر از 1
به عنوان “seed” استفاده کنیم دنباله به شکل زیر خواهد بود:
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
این گونه هم کار میکند. منتها قابلیت iterate کردن با for..of
و generator composition از دست میرود که ممکن است جای دیگری مفید باشند.