1580, 8/79 회원가입  로그인  
   kjwon15
   http://goo.gl
   배열 내에서 랜덤한 n개 추출하기

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=1897 [복사]


가끔 프로그래밍을 하다가 랜덤한 숫자(혹은 다른 어떤것)이 필요할 때가 있습니다.
한개만 뽑으려면 rand()%<원하는 범위> 처럼 뽑으면 되지만 여러개를 뽑을때는 상황이 약간 달라집니다.

예를 들어 어떤 그룹에서 두명을 뽑아 승부를 겨루는 일이 있다고 해봅시다.
rand함수를 두번 돌리면 같은사람이 두번 뽑혀서 문제가 발생합니다.(자기자신과 승부를 하는건 의미가 없죠)
사실 여기까지는 간단합니다.

보통은 이렇게 하지요
player1=rand()%(전체_인원_수);
do player2=rand()%(전체_인원_수) while player1==player2

하지만 이렇게 하면 언제 끝날지 모릅니다.(큰 배열에서 2명이라면 거의 한번에 끝나지만 이런식으로 여러명을 뽑을때는 운이 안좋으면 시간이 엄청 걸립니다.)

불필요하게 다시 랜덤을 돌리는 일을 방지하려면 이렇게 하면 됩니다.
player1=rand()%(전체_인원_수);
player2=rand()%(전체_인원_수 - 1);
if(player2>=player1) player2+=1;

어떻게 한걸까요?
처음엔 그냥 평소대로 한명을 뽑습니다.
"뽑는다"라는 말 그대로 그 한명은 제외시켰다고 생각하는거죠
그 다음은 인원수-1만큼의 범위에서 랜덤을 돌렸습니다.(아까 한명이 빠졌기 때문에)
그리고나서 플레이어1보다 크거나 같은 경우 +1을 해 주었습니다.

사람 10명을 일렬로 세워놓았다고 합시다.
앞쪽부터 1,2,3...라고 이름을 지었습니다.
(1 2 3 4 5 6 7 8 9 10)
처음에 한명을 무작위로 뽑습니다.(저는 4번을 뽑았다고 할겁니다.)
그러면 1,2,3번은 그 위치에 있고 5,6,7,8,9,10번은 앞으로 한칸씩 오게 됩니다.
(1 2 3 5 6 7 8 9 10)
여기에서 4번째 부터는 자기 위치+1이 실제의 이름이 됩니다.
그래서 if(player2>=player1) player2+=1
라는 구문이 들어간겁니다.


이런식으로 랜덤한 2개의 변수를 뽑았습니다.
다만 3개 이상의 변수를 뽑으려면 이 방법으로는 상당히 복잡해지고 효율도 낮아집니다.
이때는 비슷하지만 다른 방법을 사용합니다.

  Hit : 10318     Date : 2011/12/05 03:17
[불법/스팸글로 신고하기]



    
havu 잘봤습니다 2012/01/10  
lawsoul 잘봤습니다. ~ 2012/04/20  
1440   방화벽 설명 입니다.[2]     oldlove7
08/17 6769
1439   바이러스 만들기[8]     akwjs566
03/31 7760
1438   바이러스 종류[11]     akwjs566
04/11 5751
  배열 내에서 랜덤한 n개 추출하기[2]     kjwon15
12/05 10317
1436   배열[1]     han0161
06/14 5490
1435   백도어를 하실줄 아시는 분[6]     hacs98
05/03 6483
1434   백도어란??(이거 맞나요??)[4]     H.R.T
12/13 9183
1433   백트랙의정석 제2-1강[5]     인천해커
01/21 11524
1432   백트랙5 사용법/자세히좀 알려주세요[3]     cswcys
09/20 33109
1431   백트랙 설치방법 2     hacs98
05/05 6003
1430   백트랙 설치방법     hacs98
05/05 6407
1429   백트랙 잘하시는 분 찾습니다[1]     hacs98
05/05 6018
1428   메모리 덤프(블루 스크린=STOP 스크린) 코드 및 해결[1]     ROK.AF
02/09 10521
1427   막 간지나게 해킹하고싶어요[13]     dldvk9999
10/11 31603
1426   리버스엔지니어링 잘하시는분..?     pcw0629
08/26 3748
1425   리버스 엔지니어링 (어셈블리) -1     salangi11
02/21 5327
1424   리버스 엔지니어링 [1]     festal
09/24 6217
1423   리버싱 기초 지식 정리해봤습니다.[1]     libera826
12/25 4926
1422   리버싱 직접 공부하실수 있게 해드립니다.[1]     xellos1234
01/07 3344
1421   리모트에서 명령어 실행시키기[1]     xiangyi
02/03 8923
[1][2][3][4][5][6][7] 8 [9][10]..[79]

Copyright 1999-2021 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com