Ответ 1
Изменение существующих ответов для обеспечения равномерного диапазона распространения от -40 до -21 и от 21 до 40:
(Math.random()<.5?-1:1)*(Math.floor(Math.random()*20) + 21)
Мне нужна небольшая помощь с Math.random():
Мне нужно повернуть некоторые изображения (с преобразованием CSS3 (град))
чтобы получить результаты от -40
до +40
, но пропуская результаты из диапазона: -20 и +20
Если я не ошибаюсь, это даст мне случайные результаты в диапазоне от -40 до +40
var counter = Math.round(Math.random()*81)-40;
Как исключить из номеров результатов от -20 до +20???
Изменение существующих ответов для обеспечения равномерного диапазона распространения от -40 до -21 и от 21 до 40:
(Math.random()<.5?-1:1)*(Math.floor(Math.random()*20) + 21)
Случайный -1 или 1 раз 0-20 случайных плюс 20, может работать
(Math.random()<.5?-1:1)*Math.floor(Math.random()*20 + 21);
Примеры результатов из 1300 прогонов (для простоты показаны только положительные):
Number_21: 70
Number_22: 62
Number_23: 56
Number_24: 57
Number_25: 79
Number_26: 57
Number_27: 64
Number_28: 60
Number_29: 57
Number_30: 67
Number_31: 63
Number_32: 81
Number_33: 81
Number_34: 65
Number_35: 59
Number_36: 59
Number_37: 62
Number_38: 71
Number_39: 52
Number_40: 78
У меня было бы случайное число между 20 и 40 сгенерированными, а затем случайным образом отрицать его.
var counter = (Math.round(Math.random() * 20) + 20) * (Math.random() < 0.5 ? 1 : -1);
Без ветвей и только одиночный random()
вызов, используя магию оператора модуля:
//Return a result between -40 and +40, excluding the range -20 to +20
var zeroToThirtyNine = Math.floor(Math.random()*40)
var counter = ((zeroToThirtyNine+61)%81)-40
zeroToThirtyNine | counter --------------------------- 0 | 21 1 | 22 2 | 23 ... 18 | 39 19 | 40 20 | -40 21 | -39 ... 37 | -23 38 | -22 39 | -21
Создайте числа от -20 до +20, затем, если отрицательные, вычтите еще двадцать градусов. Если положительный, добавьте двадцать градусов.
Кроме того, вам, вероятно, нужен пол вместо раунда, поэтому вы не получите 41 градус.
var counter = Math.floor(Math.random()*81)-40;
Существует 40 возможных чисел, которые вы хотите сгенерировать (от -40 до -21, от 21 до 40 - это диапазоны с 20 номерами) → генерировать случайное равномерно распределенное число в [0,39] (которое также содержит 40 номера). Это можно сделать в Javascript от Math.floor(Math.random() * 40)
Отобразите диапазон вывода в нужный диапазон.
Например:
var uniformFrom0To39 = Math.floor(Math.random()*40)
return uniformFrom0To39 <= 19 ? uniformFrom0To39 - 40 : uniformFrom0To39 + 1
Вы также можете выполнить сопоставление с помощью массива [-40, -39,..., -21, 21, 22,..., 40] - вы могли бы также интерпретировать эту реализацию как "создать массив с значения, которые вы хотите, и выберите их случайным образом".
Ваш код дает случайные числа от -40 до +41, потому что Math.round() может округлить. Следующий код должен предоставить, что вы хотите:
if(Math.random()>0.5) {
counter = Math.round(Math.random()*19)-40 // from -40 to -21
} else {
counter = Math.round(Math.random()*19)+21 //from +21 to +40
}
Если у вас есть менее симметричная область исключения, вы можете сделать рандомизацию следующим образом:
do
{
random = Math.floor(Math.random()*81 - 40);
}
while ((randomNum < excludedMax) && (randomNum > excludedMin));
Это сработает, если вы хотите исключить, скажем, от -19 до 4 или что-то еще странное. Это также сработает хорошо для вашего дела.
Напишите цикл, который будет циклически, пока вы не получите число, выходящее за пределы диапазона. Это легко понять и легко доказать, что число, которое вы получаете, по-прежнему является случайным.