모바일 게임을 만들다 보니 필요해서 찾아보다가 알게된 셔플 알고리즘 입니다.

 

1 ~ 10까지의 숫자를 랜덤하게 중복되지 않게 뽑을 수 있는 방법이 무엇일까..

굉장히 많은 고민을 했었는데요. (독학으로 프로그래밍을 공부하다 보니..OTL)

 

처음에 생각했던 것은 nNum[10]이라는 배열을 만들어 두고,

rand()함수를 이용하여 숫자를 랜덤을 뽑은 후

for 반복문을 이용하여 이전에 뽑았던 숫자가 또 나왔는지 확인하는 방법이었습니다. (단순무식 ㅠ.ㅠ)

뽑으려는 숫자가 적은 경우 큰 문제가 없겠지만 딱 봐도 숫자가 커지만 커질수록 부담이 크겠더라구요.

그래서 여기저기 자료를 찾아보다가 알게된 셔플 알고리즘을 소개해 드립니다.

 

[셔플 알고리즘]

  • 1~10까지의 숫자를 차례로 배열에 저장
  • 카드를 섞듯이 배열안의 숫자를 셔플

 

 

[결과값]

 

 

좀 더 이해하기 쉽도록 그림으로 설명을 드리면,

 

1. nNum[10] 배열을 만들고 1~10까지의 숫자를 순서대로 저장

 

 

 

2. rand함수를 사용하여 nNum[nA]와 nNum[nB]의 랜덤 값을 얻고 두 값을 교환

  • (만약 이와 같이 rand 값이 나왔다면) nA = 3, nB = 6

  • nTemp변수를 이용하여 nNum[3], nNum[6]의 배열값을 교환 

 

 

3. 이렇게 nNum[3]와 nNum[6] 값이 교환 되겠죠?

  • for (int i = 0; i < 20; i++) 카드 섞듯이 20번을 랜덤하게 섞는거죠. ㅎㅎ

  • 물론 섞고 싶은 만큼 조건값의 숫자를 적당히 조절할 수 있습니다.

 

 

여기까지가 숫자를 중복없이 랜덤하게 뽑을 수 있는 셔플 알고리즘 이었습니다.^^

도움이 되셨나요?

 

Posted by K.나미 트랙백 0 : 댓글 0