프로그래밍을 하다보면 중복을 하지 않으면서 랜덤을 발생해야 하는 문제들이 있다.
하나의 예로 카드를 섞어 보기로 하자.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_CARD_TYPE 4
#define MAX_CARD_NUM 13
const char *ctypes[MAX_CARD_TYPE]={"♠","♥","♣","◆"};
const char *ntypes[MAX_CARD_NUM]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
int RandCard(int base[][13]);
void PrintCard(int lcnt,int ct,int cn);
void main()
{
int arr[MAX_CARD_TYPE][MAX_CARD_NUM]={0};
int lcnt = 0;
int selected;
srand((unsigned)time(NULL));
for(lcnt = 1;lcnt<=(MAX_CARD_TYPE*MAX_CARD_NUM);lcnt++)
{
selected = RandCard(arr);
PrintCard(lcnt,selected/MAX_CARD_NUM,selected%MAX_CARD_NUM);
}
}
int RandCard(int base[][MAX_CARD_NUM])
{
int cardtype = 0;
int num = 0;
int n = 0;
do
{
n = rand()%(MAX_CARD_TYPE*MAX_CARD_NUM);
cardtype = n/MAX_CARD_NUM;
num = n%MAX_CARD_NUM;
}while(base[cardtype][num]);
base[cardtype][num] = 1;
return n;
}
void PrintCard(int lcnt,int ct,int cn)
{
printf("%2d번째 카드 %s %s\n",lcnt,ctypes[ct],ntypes[cn]);
}
'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글
new 연산자 오버로딩 (0) | 2009.08.19 |
---|---|
퀵소트 (0) | 2009.08.19 |
선택정렬 (0) | 2009.08.19 |
삽입정렬 (0) | 2009.08.19 |
정보 올림피아드 (0) | 2009.08.19 |
파이, e, sin 구하기 (0) | 2009.08.19 |
Sin함수 만들기(II) (0) | 2009.08.19 |
적분 공식을 이용한 Sin(x)함수 만들기 (0) | 2009.08.19 |
정보올림피아드 프로그래밍 (0) | 2009.08.19 |
간단하게 Random함수 만들기 (0) | 2009.08.19 |