Случайное число javascript/jquery между -13 и 13, исключая числа от -3 до 3

Я использую

var min = -13;
var max = 13;
var random = Math.floor(Math.random() * (max - min + 1)) + min;

но он возвращает ВСЕ числа (случайные) между -13 и 13. как я могу заставить его генерировать случайное число между -13 до -4, исключая -3, -2, -1, 0, 1, 2, 3 и в том числе от 4 до 13.

Ответ 1

Получите случайное число между 1-10 и добавьте 3, чтобы получить один между 4-13:

random = Math.ceil(Math.random() * 10) + 3;

Создать случайное значение между 0-1. Если это 0, сделайте число отрицательным:

random = (Math.floor(Math.random() * 2) == 0) ? 0 - random : random;

JSFiddle, показывающий рабочую копию:

http://jsfiddle.net/adamh/cyGwf/

Ответ 2

Насколько я знаю, невозможно создать случайное число и принять во внимание набор исключений. Вам нужно создать рекурсивную функцию для фильтрации. См. Ниже:

function GenerateRandomNumber() {
    var min = -13, max = 13;
    var random = Math.floor(Math.random() * (max - min + 1)) + min;   

    // If random number is undesirable, generate a new number, else return
    return (random < 4 && random > -4) ? GenerateRandomNumber() : random;
}

var myRandomNumber = GenerateRandomNumber();
​

Здесь рабочая скрипка.

Или, вежливость @Rozwel, нерекурсивная версия с использованием цикла while:

function GenerateRandomNumber() {
    var min = -13, max = 13;
    var random = 0;

    while (random < 4 && random > -4) {
        random = Math.floor(Math.random() * (max - min + 1)) + min;
    }

    return random;
}

Здесь jsperf, который сравнивает принятый ответ с этими двумя параметрами.

Ответ 3

Незначительное изменение того, что у вас есть, должно это сделать. Производите случайное число в диапазоне от -6 до 13, а затем, если значение меньше 4, вычитайте 7. Я его не тестировал, но я подозреваю, что он будет работать лучше, чем производить два рандома и умножать.

var min = -6; 
var max = 13; 
var random = Math.floor(Math.random() * (max - min + 1)) + min; 
if(random < 4){random = random - 7;}

Ответ 4

var pickOne = [4,5,6,7,8,9,10,11,12,13],
    value   = pickOne[Math.floor(Math.random() * pickOne.length)];

value   = (Math.random() < 0.5)? value : -value;
console.log(value)

Ответ 5

var sign = Math.round(Math.random()) == 0 ? -1 : 1;
var number = Math.round(Math.random() * 9) + 4;
return sign * number;

Ответ 6

Math.round(Math.random()) возвращает 0 или 1,

поэтому его можно записать без промежуточного значения:

alert( (Math.ceil(Math.random() * 10) + 3)*(Math.round(Math.random())?1:-1));

Ответ 7

var n = Math.floor(Math.random() * 20) - 10;
n = n < 0 ? n - 3 : n + 4;