프로그래밍/Node.js

[javascript] 배열 순서를 마구 뒤섞기(shuffle)

채윤아빠 2023. 11. 6. 20:03
728x90
반응형

 

자바스크립트에서 배열 내부의 항목들을 마구 뒤썩어주는 방법을 찾아 보니, 다양한 방법들이 있었는데, 그 중에서 쓸만한 방법들을 정리해 둡니다.

함수로 이용할 때는 다음과 같이 shuffleArray()라는 함수를 만들어서 이용하면 편리할 것 같습니다.

function shuffleArray(a){//array
 let c=a.length;let b=d=c;while(c)b=Math.random()*(--c+1)|0,d=a[c],a[c]=a[b],a[b]=d
}

위 함수를 임의의 배열에 적용한 결과는 다음과 같습니다.

>> let unshuffled = ['hello', 'a', 't', 'q', 1, 2, 3, {cats: true}]
>> unshuffled
(8) ['hello', 'a', 't', 'q', 1, 2, 3, {…}]
>> shuffleArray(unshuffled)
>> unshuffled
(8) ['a', 1, 2, 'q', 'hello', {…}, 't', 3]

위에서 정의한 shuffleArray() 함수를 읽기 쉽게 풀어보면 아래와 같습니다.

function shuffleArray( array ){
 var count = array.length,
     randomnumber,
     temp;
 while( count ){
  randomnumber = Math.random() * count--0; // cast int ; remove decimal
  temp = array[count];
  array[count] = array[randomnumber];
  array[randomnumber] = temp
 }
}

함수를 이용하여 위하여 파일을 참조하는 등이 귀찮다면, 다음과 같이 한 줄을 인라인하여 간단하게 처리할 수도 있습니다.

>> unshuffled.sort(() => Math.random() - 0.5);
(8) ['q', 't', 1, 'hello', 'a', {…}, 3, 2]
>> unshuffled.sort(() => Math.random() - 0.5);
(8) [1, {…}, 't', 'a', 3, 'hello', 'q', 2]

하지만 위와 같은 방식은 간편하지만, 편향적이라 임의대로 뒤섞는 것이 중요할 경우에는 이용하면 안됩니다.


참고자료