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