как удалить заголовки пустых заголовков

Если я правильно понимаю, вы просто ищете перестановку (т. е. числа, рандомизированные без повторов) чисел 1-10? Возможно, попробуйте создать рандомизированный список этих чисел, один раз, в начале, а затем просто проработайте свой путь через них?

Это вычислит случайную перестановку чисел в nums:

var nums = [1,2,3,4,5,6,7,8,9,10],
    ranNums = [],
    i = nums.length,
    j = 0;

while (i--) {
    j = Math.floor(Math.random() * (i+1));
    ranNums.push(nums[j]);
    nums.splice(j,1);
}

Итак, например, если вы искали случайные числа между 1-20, которые были даже четными, то вы могли бы использовать:

nums = [2,4,6,8,10,12,14,16,18,20];

Затем просто прочитайте ranNums в чтобы запомнить случайные числа.

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

EDIT: после чтения это и выполнение теста на jsperf , кажется, что гораздо лучший способ сделать это - переключение Fisher-Yates:

function shuffle(array) {
    var i = array.length,
        j = 0,
        temp;

    while (i--) {

        j = Math.floor(Math.random() * (i+1));

        // swap randomly chosen element with current element
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    }

    return array;
}

var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);

В принципе, это больше эффективными, избегая использования «дорогих» операций с массивами.

BONUS EDIT: Другая возможность - использование генераторов (если у вас есть поддержка ):

function* shuffle(array) {

    var i = array.length;

    while (i--) {
        yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0];
    }

}

Затем, чтобы использовать:

var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);

ranNums.next().value;    // first random number from array
ranNums.next().value;    // second random number from array
ranNums.next().value;    // etc.

, где ranNums.next().value в конечном итоге будет оценивать undefined после того, как вы запустите thr все элементы в перетасованном массиве.

В целом это будет не так эффективно, как Fisher-Yates Shuffle, потому что вы все еще splice - массив. Но разница в том, что вы сейчас делаете эту работу только тогда, когда вам это нужно, а не делаете все это заранее, поэтому в зависимости от вашего варианта использования это может быть лучше.

0
задан Gowtham K 26 February 2015 в 10:11
поделиться