Psevdo-tasodifiy generator
Biz tasodifiy ma’lumotlarga muhtoj bo’lgan ko’plab joylar mavjud.
Ulardan biri testlar. Ishlarni yaxshi tekshirish uchun bizga tasodifiy ma’lumotlar kerak bo’ladi: matn, raqamlar va boshqalar.
JavaScript-da biz Math.random()
dan foydalanishimiz mumkin. Lekin, agar biror narsa noto’g’ri bo’lsa, biz xuddi shu ma’lumotlardan foydalanib, testni takrorlashni xohlaymiz.
Buning uchun “urug’langan psevdo-tasodifiy generatorlar” ishlatiladi. Ular birinchi qiymat bo’lgan “urug 'ni” olishadi, so’ngra formuladan foydalanib keyingilarini hosil qilishadi. Shunday qilib, bir xil urug’ bir xil ketma-ketlikni beradi va shuning uchun butun oqim osongina takrorlanadi. Biz uni takrorlash uchun faqat urug’ni eslashimiz kerak.
Bir xil taqsimlangan qiymatlarni yaratadigan bunday formulaning misoli:
next = previous * 16807 % 2147483647
Agar biz 1
ni urug’ sifatida ishlatsak, qiymatlar quyidagicha bo’ladi:
16807
282475249
1622650073
- …va hokazo…
Vazifa pseudoRandom(seed)
generator funktsiyasini yaratishdir, u seed
ni oladi va generatorni ushbu formulada yaratadi.
Foydalanish misoli:
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
Iltimos, unutmang, xuddi shu kabi odatdagi funktsiya bilan amalga oshirilishi mumkin:
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
Bu kontekst uchun juda yaxshi. Ammo keyin biz for..of
bilan takrorlash va boshqa joyda foydali bo’lishi mumkin bo’lgan generator tarkibidan foydalanish qobiliyatimizni yo’qotamiz.