내맘대로 라이프

[AS3.0] 배열 랜덤하게 재정렬하기 본문

Flash Actions Script 3.0 (as3)

[AS3.0] 배열 랜덤하게 재정렬하기

내눈물 2016. 10. 17. 09:53

배열안의 내용물을 랜덤하게 섞는 함수입니다.

이래저래 쓸만한게 없어서 이거저거 보다가 만들었습니다.


var myArray:Array = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
 

function randomArray(targetArray:Array):Array {
 var tempArray:Array = new Array();
 var maxLength = targetArray.length
 var mainArray = targetArray.concat();
 for (var i = 0; i < maxLength; i++) {
  var tempNum:int = Math.random() * mainArray.length;
  var targetNum = mainArray[tempNum];
  mainArray.splice(tempNum, 1);
  tempArray.push(targetNum);
 }
 return tempArray;
}
 

 

myArray라는 배열을 하나 만들고 0~11까지 넣어줍니다. (안에 내용물은 숫자가 아니더라도 관계 없어요)

그다음 랜덤 어레이를 만들어서

섞은 내용을 임시 저장할 temp배열을 만들고

배열의 총 길이를 숫자로 따로 저장합니다 (밑의 for문에 targetArray.length를 넣어주게되면 targetArray의 길이는 점점 줄어들기 때문에

for문이 일찍 끊겨버립니다)

그다음 for문을 돌려서 타겟배열의 길이만큼 랜덤을 돌려서 그걸 정수값으로 변환한 다음에 타겟배열의 tempNum번째의 배열값을

따로 저장합니다.

그런담에 타겟배열의 tempNum번째의 배열값을 삭제하고 아까 저장한 targetNum(랜덤으로 뽑아온 타겟 배열의 배열값)을

temp배열에 차례로 넣어주는거죠

전부 완료되면 리턴~

 

중요한 점은 var mainArray 라는걸 하나 생성해서 원본 배열을 concat해줘야한다는 점입니다.

splice는 기존 배열에서 요소를 삭제하는 것이기 때문에 concat을 하지 않고

 var mainArray = targetArray 이런식으로 해주면

mainArray를 splice해도 원본 배열이 삭제가 됩니다.

concat은 복제이기 때문에 완전히 별개의 배열이 되는 겁니다.

그래서 원본 배열이 삭제되지 않죠

여러번 반복해서 랜덤으로 돌려야할때는 꼭 필요합니다.