JavaScript

Знатоки JavaScript'a, вам сюда

Почему не рекомендуется использовать Math.round, когда делаешь генератор случайных чисел.

И ещё, почему пишется Math.floor(Math.random() * (max - min + 1)) + min;, ведь можно написать просто
Math.floor(Math.random() * (max + 1)); и получится тоже самое, или нет ?

function getRandomInt(min, max) {
Math.floor(Math.random() * (max - min + 1)) + min;
}
document.write('' + getRandomInt(1, 100))
А я не рекомендую использовать метод
Math.floor() (возвращает наибольшее целое число, которое меньше или равно данному числу.)
А вместо него надо вставлять Math.round() (возвращает число, округлённое к ближайшему целому.)
Так как Math.floor() он портит саму идею случайности если не поняли почему читайте внимательно описание в скобках!
//Ну тут явная ошибка математику плохо учил автор
function getRandomInt(min, max) {
Math.floor(Math.random() * (max - min + 1)) + min;
}
//Вот направительный вариант
function getRandomInt(min, max) {
Math.floor(Math.random() * (max - min)) + min;
}

(Почему не рекомендуется использовать Math.round, когда делаешь генератор случайных чисел. ) Кто не рекомендует? Безграмотные программеры которые функцию не сумели написать правильно потому что математику не знают они что ли ???
Любой генератор случайных чисел посте является генератором псевда случайных чисел Тесть если какой небуть хакер математик жёстко возьмётся за этот вопрос то рана или поздно он сможет предсказать вероятность положительного результата Так что в казнено рулетку и однорукого бандита не стоит делать на компараторе. Хотя также можно предсказать вероятность любой отдельно взятой физической рулетки!
(Math.floor(Math.random() * (max + 1)); и получится тоже самое, или нет ?)
Нет это совсем не тоже самое вы убрали минимум допустим у вас минимум 10 а максимум 20 то по первой формуле получится что число будит выпадать от 10 до 21 А по вашей от 0 до 21 плюс Math.floor ещё он попортит всю идею А по моей будет всё Окей то есть будет число от 10 до 20 с хорошей степенью случайности.

На подлесок пример использования генератора случайных чисел

<div id="cunt" style="font-size: 40px; position: fixed; left: 100px; top: 100px; width: 40px; height: 40px;">&#128001;</div>
<script>
cunt.style.top=Math.round(this.innerHeight/2-20)+'px';
cunt.style.left=Math.round(this.innerWidth/2-20)+'px';
setInterval(()=>{
cunt.style.top=cunt.offsetTop+Math.round((Math.random()-0.5)*2)+'px';
cunt.style.left=cunt.offsetLeft+Math.round((Math.random()-0.5)*2)+'px';
},1);
</script>

Засеки время как долго мышка будет на экране
потом вместо Math.round вставь Math.floor и засеки снова время и главное смотри куда она будет убегать чаще всего !

И ты всё поймёшь....





Мирас Мукунов
Мирас Мукунов
83 942
Лучший ответ
Александр Баранов Спасибо, повеселил. Ты привёл эталонный пример того, как round даёт НЕРАВНОМЕРНЫЕ вероятности.

Math.round((Math.random() - 0.5) * 2) ==
Math.round(2 * Math.random() - 1) ==
Math.round(2 * Math.random()) - 1

В 25% случаев координата уменьшится: random in [0; 0.25);
Math.round(2 * Math.random()) - 1 == -1

В 25% случаев координата увеличится: random in [0.75; 1);
Math.round(2 * Math.random()) - 1 == +1

В 50% случаев координата не изменится: random in [0.25; 0.75);
Math.round(2 * Math.random()) - 1 == 0
Александр Баранов Очевидно, ты не понимаешь, что для обеспечения РАВНОЙ вероятности ТРЁХ событий необходимо писать так:
Math.floor(3 * Math.random()) - 1
Потому, что при использовании round вероятность появления min и max будет вдвое меньше вероятности появления любого другого числа диапазона.
в первом случае генерируются числа от min до max, в твоем случае от 0 до max
Math.floor(Math.random() * (max - min + 1)) + min; охватывает целые отрицательные числа, помимо положительных, насколько мне видно.
Binosh818 Binosh818
Binosh818 Binosh818
2 084