Min ve Max arasında rasgele tam sayı üretmek.
randomInteger(min,max) adında bir fonksiyon yazın. Bu fonksiyon sadece min ve max değerleri arasında tam sayı döndürsün.(min ve max ikisi de dahil)
Her defasında min..max aynı olasılıkla seçilmelidir.
Örnek:
alert( random(1, 5) ); // 1
alert( random(1, 5) ); // 3
alert( random(1, 5) ); // 5
Bir önceki görevi temel alabilirsiniz.
Basit fakat yanlış çözüm
Basit yöntem, min ile max arasında rasgele bir değer bulup bunu yuvarlamaktır.
function randomInteger(min, max) {
let rand = min + Math.random() * (max - min);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
Fonksiyon çalışır fakat yanlıştır. min ve max ın kenar değerlerinin seçilmesi diğer değerlere göre iki kat azdır.
Eğer yukarıdaki örneği birçok defa çalıştırırsanız en fazla 2 nin döndüğünü göreceksiniz.
Bu böyle olur çünkü Math.round() , 1..3 arasında rasgele değerler alır ve aşağıdaki gibi bunları yuvarlar:
1 ... ile 1.4999999999 arası 1
1.5 ... ile 2.4999999999 arası 2
2.5 ... ile 2.9999999999 arası 3
Gördüğünüz gibi 1’in 2ye göre seçilme olasılı 2 defa daha azdır. 3 için de aynıdır.
Doğru çözüm
Aslında birçok doğru çözüm vardır. Bir tanesi, aralık sınırlarının ayarlanmasıdır. Her defasında aynı aralık seçildiğinden emin olunmalıdır. 0.5 ile 2.5 arasında değerler üretilebilir. Bu şekilde kenarlara olasılık için ağırlık eklenmiş olur.
function randomInteger(min, max) {
// (min-0.5) ile (max+0.5) arasında
let rand = min - 0.5 + Math.random() * (max - min + 1);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
Diğer bir alternatif ise Math.floor kullanılarak min ile max+1 aralığından rasgele bir sayı seçilmesidr.
function randomInteger(min, max) {
// rasgele min ile (max+1) arasındadır.
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
alert( randomInteger(1, 3) );
Şimdi ise aralıklar şu şekilde haritalanır:
1 ... ile 1.9999999999 arası 1 olur
2 ... ile 2.9999999999 arası 2 olur
3 ... ile 3.9999999999 arası 3 olur
Tüm aralıklar aynı boyutlara sahiptir. Son tahlilde hepsi aynı olasılığa sahiptir.