Как генерировать случайное число без дубликатов [дублировать]

Чтобы иметь понимание между компилятором и программистом. Правило состоит в том, что исходный код должен иметь самый открытый публичный класс, и этот класс должен содержать основную функцию. Таким образом, без каких-либо путаницы / ограничения компилятор может получить доступ (общедоступный) класс и имя имени класса для файла класса. Также, поскольку этот класс содержит main (), выполнение файла класса даст правильный поток

3
задан Trent Braswell 23 March 2013 в 10:11
поделиться

4 ответа

Я бы предпочел сделать это примерно так:

http://jsfiddle.net/YC58s/

generate = function(length)
{
    var arr = [];
    var n;
    for(var i=0; i<length; i++)
    {
        do
            n = Math.floor(Math.random()*20+1);
        while(arr.indexOf(n) !== -1)

       arr[i] = n;
    }

    return arr;
}
3
ответ дан apelsinapa 15 August 2018 в 20:15
поделиться
  • 1
    Не могли бы вы объяснить, как это работает. Я получаю цикл, возврат, vars, но оператор while. Как это работает, почему он не повторяет? – Trent Braswell 25 March 2013 в 07:36
  • 2
    @TrentBraswell цикл while - это do / while. Это означает, что он выполнит оператор inline и установит n на случайное число, прежде чем проверять критерий. Критерий оценивает, есть ли такое значение в массиве. indexOf (n) возвращает целочисленный ключ для значения n, если он существует в массиве, иначе он возвращает -1. Таким образом, запуск цикла снова, если indexOf не возвращает -1. – apelsinapa 25 March 2013 в 10:51

Это может обрабатывать генерацию до 20-значного UNIQUE случайного числа

JS

var generatedNumbers = [];

function generateRandomNumber(precision) { // precision --> number precision in integer 
    if (precision <= 20) {
        var randomNum = Math.round(Math.random().toFixed(precision) * Math.pow(10, precision));
        if (generatedNumbers.indexOf(randomNum) > -1) {
            if (generatedNumbers.length == Math.pow(10, precision))
                return "Generated all values with this precision";
                return generateRandomNumber(precision);
        } else {
            generatedNumbers.push(randomNum);
            return randomNum;
        }
    } else
       return "Number Precision shoould not exceed 20";
}
generateRandomNumber(1);

JsFiddle

0
ответ дан Nofi 15 August 2018 в 20:15
поделиться

как только он на самом деле попадает в число, то же самое

Он никогда не должен. Такие алгоритмы занимают больше времени, чем дольше они выполняются . Вы должны использовать другой подход:

Поместите все возможные числа в пул. Как только вы нарисуете номер, удалите его из пула. Как и в реальной жизни.

var pool = [1, 2, 3, 4, 5];
var getNumber = function () {
    if (pool.length == 0) {
        throw "No numbers left";
    }
    var index = Math.floor(pool.length * Math.random());
    var drawn = pool.splice(index, 1);
    return drawn[0];
};
8
ответ дан user123444555621 15 August 2018 в 20:15
поделиться
window.onload = unRanNumGen(20, 1, 12);
    //above, we need 12 random numbers between 20 (included) and 1(included)

function unRanNumGen(max, min, limit){

    //max = maximum number [inclued] (range of numbers)
    //min = minimum number [included] (range of numbers)
    //limit = number of random numbers (how many numbers do you want?)

    var pool = [genRan(max, min)];

    for(i=0; i<limit; i++){
        for(n = 0; n <i; n++){

            if(pool[n] !== genRan(max, min)){
            pool.push(genRan(max, min));

            break;
            }
        }

    }

function genRan(max, min){
    var genRan = Math.floor(Math.random() * (max - min) + min);
    return genRan;
}

alert(pool.join('\n')); //to display the array of random numbers

}
-1
ответ дан Yogie 15 August 2018 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: