2011-01-20 3 views
2

Say У меня есть массив:Randomize или перетасовать массив

myList:Array = new Array(); 
myList = [1,2,3,4,5,6,7,8,9]; 

myRandomList:Array = new Array(); 

for (var i:uint = 0; i < myList; i++) { 
      var item:Number = Math.floor(Math.random() * myList.length-1) + 1; 
      myRandomList.push(item); 
     } 

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

UPDATE:

Я только что видел этот метод перетасовки массив из shadetyler.blogspot.com/2008/12/array-shuffle-as3.html

Array.prototype.shuffle = function(){ 
for(var i = 0; i < this.length; i++){ 
var a = this[i]; 
var b = Math.floor(Math.random() * this.length); 
this[i] = this[b]; 
this[b] = a; 
} 

Однако, есть способ переписать это как функцию? }

+0

Посмотрите на функцию 'array.splice'. –

+0

Я только что увидел, что вы можете использовать сращивание ... но есть также метод Array.prototype, который должен быть быстрее? shadetyler.blogspot.com/2008/12/array-shuffle-as3.html – redconservatory

+0

Попробуйте мою реализацию для перетасовки массива, ответьте здесь: http://stackoverflow.com/a/25702799/1521021 – Glogo

ответ

3

Название говорит, что shuffle массив, поэтому, если вы ищете идеальный тасол, вам может понадобиться алгоритм Fisher–Yates, который является объективным.

Так что если вы хотите использовать/сохранить оригинал, вы бы инициализировать myRandomList

var myRandomList: Array = new Array(myList.length); 

Затем создайте случайное число с диапазоном сказать , а затем поменять myRandomList[a] с myRandomList[i], где я это текущий элемент.

// Random number 
var a = Math.floor(Math.random() * myList.length); 
// A swap 
myRandomList[i] = myRandomList[a]; 
// put whatever is in index a in the ith position 
myRandomList[a] = myList[i]; 
// restore whatever was in the ith position to index a 
+0

Это замечательно! Но ссылка не имеет примера ActionScript 3 ... можете ли вы подробнее рассказать об этом? – redconservatory

+0

@redconservatory вы просто переключаете пятна внутри массива, поэтому не нужно вставлять в него элементы. Что касается дубликатов, если 'a == i', то изменений нет. – phwd

1

Я не сделал много ActionScript, но если есть изменяемыми класс массив, вы можете случайно передать данные ... Ex:

массив из массива

для перебрать с итератором j. Предварительно генерировать этот номер, потому что она изменится я = получить случайный индекс в от к [J] = с [я] удалить из [I]

Если нет размера изменяемого класса массива, вы всегда можете сделать случайную подкачка

массива theArray

рандов = случайное число для ранда idx1, idx2 -> набор случайных чисел темп = theArray [idx1] theArray [idx1] = theArray [idx2] theArray [idx2] = temp

что-то вроде этого это просто код psudo.

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