Sebuah integer acak dari min ke max
Buatlah sebuah fungsi randomInteger(min, max)
yang menghasilkan angka integer acak dari min
ke max
termasuk keduanya min
dan max
sebagai nilai yang mungkin.
Angka apa pun dari interval min..max
harus muncul dengan probabilitas yang sama.
Contoh kerjanya:
alert( randomInteger(1, 5) ); // 1
alert( randomInteger(1, 5) ); // 3
alert( randomInteger(1, 5) ); // 5
Anda dapat menggunakan solusi dari tugas sebelumnya sebagai basis.
The simple but wrong solution
The simplest, but wrong solution would be to generate a value from min
to max
and round it:
function randomInteger(min, max) {
let rand = min + Math.random() * (max - min);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
The function works, but it is incorrect. The probability to get edge values min
and max
is two times less than any other.
If you run the example above many times, you would easily see that 2
appears the most often.
That happens because Math.round()
gets random numbers from the interval 1..3
and rounds them as follows:
values from 1 ... to 1.4999999999 become 1
values from 1.5 ... to 2.4999999999 become 2
values from 2.5 ... to 2.9999999999 become 3
Now we can clearly see that 1
gets twice less values than 2
. And the same with 3
.
The correct solution
There are many correct solutions to the task. One of them is to adjust interval borders. To ensure the same intervals, we can generate values from 0.5 to 3.5
, thus adding the required probabilities to the edges:
function randomInteger(min, max) {
// now rand is from (min-0.5) to (max+0.5)
let rand = min - 0.5 + Math.random() * (max - min + 1);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
An alternative way could be to use Math.floor
for a random number from min
to max+1
:
function randomInteger(min, max) {
// here rand is from min to (max+1)
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
alert( randomInteger(1, 3) );
Now all intervals are mapped this way:
values from 1 ... to 1.9999999999 become 1
values from 2 ... to 2.9999999999 become 2
values from 3 ... to 3.9999999999 become 3
All intervals have the same length, making the final distribution uniform.