Подтвердить что ты не робот

Math.random() help получает '+ N' и '-N' randoms (исключая определенный диапазон)

Мне нужна небольшая помощь с Math.random():
Мне нужно повернуть некоторые изображения (с преобразованием CSS3 (град))
 чтобы получить результаты от -40 до +40
, но пропуская результаты из диапазона: -20 и +20

math random defined + - radius

Если я не ошибаюсь, это даст мне случайные результаты в диапазоне от -40 до +40

  var counter = Math.round(Math.random()*81)-40;

Как исключить из номеров результатов от -20 до +20???

4b9b3361

Ответ 1

Изменение существующих ответов для обеспечения равномерного диапазона распространения от -40 до -21 и от 21 до 40:

(Math.random()<.5?-1:1)*(Math.floor(Math.random()*20) + 21)

Ответ 2

Случайный -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

Ответ 3

У меня было бы случайное число между 20 и 40 сгенерированными, а затем случайным образом отрицать его.

var counter = (Math.round(Math.random() * 20) + 20) * (Math.random() < 0.5 ? 1 : -1);

Ответ 4

Без ветвей и только одиночный 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

Ответ 5

Создайте числа от -20 до +20, затем, если отрицательные, вычтите еще двадцать градусов. Если положительный, добавьте двадцать градусов.

Кроме того, вам, вероятно, нужен пол вместо раунда, поэтому вы не получите 41 градус.

var counter = Math.floor(Math.random()*81)-40;

Ответ 6

Существует 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] - вы могли бы также интерпретировать эту реализацию как "создать массив с значения, которые вы хотите, и выберите их случайным образом".

Ответ 7

Ваш код дает случайные числа от -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
}

Ответ 8

Если у вас есть менее симметричная область исключения, вы можете сделать рандомизацию следующим образом:

do
{
    random = Math.floor(Math.random()*81 - 40);
}
while ((randomNum < excludedMax) && (randomNum > excludedMin));

Это сработает, если вы хотите исключить, скажем, от -19 до 4 или что-то еще странное. Это также сработает хорошо для вашего дела.

Ответ 9

Напишите цикл, который будет циклически, пока вы не получите число, выходящее за пределы диапазона. Это легко понять и легко доказать, что число, которое вы получаете, по-прежнему является случайным.