Min dan max gacha bo'lgan tasodifiy tamsayi son
Tasodifiy tamsayı sonini min dan max gacha, shu jumladan min va max qiymatlarini ham hosil qiladigan randomInteger(min, max) funktsiyasini yarating.
min..max intervalidan istalgan raqam bir xil ehtimollik bilan paydo bo’lishi kerak.
Uning ishining namunalari:
alert(randomInteger(1, 5)); // 1
alert(randomInteger(1, 5)); // 3
alert(randomInteger(1, 5)); // 5
Siz oldingi topshiriq yechimini asos sifatida ishlatishingiz mumkin.
Oddiy, ammo noto’g’ri yechim
Eng sodda, ammo noto’g’ri yechim, min dan max" gacha qiymat hosil qilish va uni yaxlitlash:
function randomInteger(min, max) {
let rand = min + Math.random() * (max - min);
return Math.round(rand);
}
alert(randomInteger(1, 3));
Funktsiya ishlaydi, ammo bu noto’g’ri. min va max chekka qiymatlarini olish ehtimoli boshqalarga nisbatan ikki baravar kam.
Yuqoridagi misolni bir necha bor takrorlasangiz, 2 ning tez-tez paydo bo’lishini osongina ko’rasiz.
Buning sababi, Math.round() tasodifiy sonlarni 1..3 oralig’idan oladi va ularni quyidagicha yaxlitlaydi:
1 ... dan 1.4999999999 gacha qiymatlar 1 ga aylanadi
1.5 ... dan 2.4999999999 gacha qiymatlar 2 ga aylanadi
2.5 ... dan 2.9999999999 gacha qiymatlar 3 ga aylanadi
Endi aniq ko’rishimiz mumkinki, 1 qiymati 2 dan ikki baravar kamroq qiymatga ega bo’ladi. Va 3 ham shunday.
To’g’ri yechim
Vazifani hal qilishning ko’plab to’g’ri yechimlari mavjud. Ulardan biri intervalli chegaralarni sozlashdir. Xuddi shu intervallarni ta’minlash uchun biz 0,5 dan 3,5 gacha qiymatlarni yaratishimiz mumkin, shu bilan kerakli ehtimollarni qirralarga qo’shamiz:
function randomInteger(min, max) {
// endi (min-0.5) dan (max+0.5) gacha
let rand = min - 0.5 + Math.random() * (max - min + 1);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
Shu bilan bir qatorda tasodifiy son uchun Math.floor min dan max + 1 gacha foydalanish mumkin:
function randomInteger(min, max) {
//bu yerda min dan (max+1) gacha
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
alert( randomInteger(1, 3) );
Endi barcha intervallar quyidagicha ishlaydi:
1 ... dan 1.9999999999 gacha qiymatlar 1 ga teng
2 ... dan 2.9999999999 gacha qiymatlar 2 ga teng
3 ... dan 3.9999999999 gacha qiymatlar 3 ga teng
Barcha intervallar bir xil uzunlikka ega bo’lib, yakuniy taqsimot bir xil bo’ladi.