조커 뺐다.
#include <stdlib.h>
#define CARD_COUNT 52
int deck[CARD_COUNT];
void shuffle()
{
for(int i = 0; i < CARD_COUNT; ++i) deck[i] = i;
for(int target = CARD_COUNT - 1; target > 0; --target)
{
int select = rand() % (target + 1);
if(target == select) continue;
deck[target] ^= deck[select] ^= deck[target] ^= deck[select];
}
}
재귀와 재시도 없다.
엑소의 으르릉
이거 모두 if(target == select) continue; 조건이면 아무 카드도 숫자가 할당되지않지않나요? 먼가좀 빠진거같아요
ㅋㅋㅋ
의미를 이해 못하신듯
제일 처음 뽑은 카드는 deck[CARD_COUNT - 1] 에 저장돼.
두번째는 - 2.... 그런식으로 해서 1번째 까지 뽑게 되지.
음 곰곰히 생각해봤는데 맞네요 음...
0 ~ target 이 팬덤을 생성할 범위인데, 그렇게 선택된 select 와 target(채워야할 제일 오른쪽 끝) 의 내용을 바꿔 놓으니, 뽑힌 카드는 제일 우측에 쌓이는거지. 이때 만약 랜덤에 의해 제일 우측이 선택되었다면 xor 로 swap 하면 0이 되어버릴테니까
continue.
바꿀 필요도 없는거구.
저거면 끝이야. 뽑은 카드 순으로 우측에 쌓이게 되어 있어.
셔플했을때 무조건 모든 경우의 수가 나오네요 자기자신은 xor하면 이상해지니까 건너뛴거고..
응. 그럼. 낄낄.
전 처음에 continue 해주신이유가 3번자리에는 3번카드가 절대로 나올수없게할려고 짜신건줄알았는데 그냥 xor때문에 그러신건걸 꺠달았네요 이궁 ㅋㅋ
뭐 성능은 temp 두는게 좀 더 빠르겠지? 아무래도 ㅋㄷ 걍 재밌어보이라고 한거.
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.