Math.random () помогает получить случайные числа '+ N' и '-N' (исключая определенный диапазон) - PullRequest
18 голосов
/ 16 августа 2011

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

math random defined + - radius

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

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

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

Ответы [ 9 ]

13 голосов
/ 16 августа 2011

Случайный -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
10 голосов
/ 16 августа 2011

Я бы сгенерировал случайное число от 20 до 40, а затем случайно отменил бы его.

var counter = (Math.round(Math.random() * 20) + 20) * (Math.random() < 0.5 ? 1 : -1);
9 голосов
/ 16 августа 2011

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

(Math.random()<.5?-1:1)*(Math.floor(Math.random()*20) + 21)
7 голосов
/ 17 августа 2011

Без ответвлений и только одиночного 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
6 голосов
/ 16 августа 2011

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

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

var counter = Math.floor(Math.random()*81)-40;
4 голосов
/ 16 августа 2011

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

3 голосов
/ 16 августа 2011

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

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

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

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

0 голосов
/ 16 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...