2013-06-01 3 views
-1

Мне нужно 10 различных случайных чисел в массиве.10 различных чисел в массиве

Я использую следующую функцию:

for (k=0;k<10;k++) { 
     x[k] = Math.floor((Math.random()*10)); 
     for (l=0;l<k;l++){ 
     if (x[l]==x[k]){fail=true;} 
     } 
     if (fail){k=k-1;} 
    } 

THX для ответа.

+1

Ну, что случилось с кодом у вас есть сейчас? Он ничего не делает? Сделать ошибку? Сбой компьютера? Сделать летающих обезьян падать с неба? Дайте вам бесплатные вафли? Просьба уточнить. – Doorknob

+0

Вы серьезно? – ose

+0

Просто не работает – maty

ответ

3

Убедитесь, что все переменные объявляются:

var x = [], k, l, fail; 

Убедитесь, что сброс «глючить» перед внутренним контуром:

fail = false; 
    for (l = 0; l < k; l++) 
    // ... 

Теперь, когда сказал, если вы хотите 10 номеров в массиве , а массив будет содержать 10 элементов, вам лучше заполнить массив цифрами от 1 до 10 (или от 0 до 9; что угодно), а затем shuffling the array. Если вы делаете что-то по-своему, то производительность процесса непредсказуема. Когда вы дойдете до последних двух элементов, это может занять две или три попытки, или это может занять сотни; вы никогда не знаете, что может сделать последовательность случайных чисел.

+1

+1 за возможность исправить этот код, который едва ли имеет смысл: P – Doorknob

+0

y это было глупо плохо ... но я делаю больше неприятностей XD все еще не работает. – maty

+0

@maty, если вы вносите изменения, которые я описал, он работает нормально. – Pointy

3

Было бы лучше, чтобы заполнить массив с номерами от 1 до 10, а затем перетасовать ее, как это:

var myArray = [1,2,3,4,5,6,7,8,9,10]; 

//shuffle array 
//code from http://stackoverflow.com/a/2450976/1223693 
var i = myArray.length, j, temp; 
if (i === 0) return false; 
while (--i) { 
    j = Math.floor(Math.random() * (i + 1)); 
    temp = myArray[i]; 
    myArray[i] = myArray[j]; 
    myArray[j] = temp; 
} 

//done 
alert(myArray); 

Ваш текущий метод очень медленно, потому что

  • это имеет внутренний цикл
  • он может генерировать неправильные номера много много раз, прежде чем он генерирует правильный номер
+0

thx для ответа, но у меня уже есть мой код – maty

+0

@maty Да, но ваш код очень медленный – Doorknob

1

Вы действительно хотите иметь массив с 10 элементами со случайными номерами от 0 до 9, и ни один из них не может быть одним и тем же? Итак, вы хотите, чтобы цифры 0-9 в 10 элементах перетасовывались вокруг?

Тогда просто инициализировать их и перетасовать их:

//+ Jonas Raoni Soares Silva 
//@ http://jsfromhell.com/array/shuffle [v1.0] 
function shuffle(o){ //v1.0 
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
    return o; 
}; 


// init the array: 
var a = new Array(); 
for (var i=0;i<10;i++){ 
    a.push(i); 
} 
// shuffle it. 
a = shuffle(a); 
1

может быть simpler-

var nums= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].sort(
function(){return Math.random()-.5}); 
+0

См. [Правильно ли использовать метод JavaScript Array.sort() для перетасовки?] (Http : //stackoverflow.com/q/962802/1048572) - нет, это не так. – Bergi

+0

@bergi: иногда простой метод - все, что вам нужно - то, что не подходит для криптографии, может быть достаточно для слайд-шоу, например – kennebec

Смежные вопросы