c言語によるアナログシャッフルの実現

16218 ワード

まずトランプを保存します
struct s  PAI
{
	char	suit[10];   //    
	char	face[10];   //    
}card[52];              // 52  
int i;
for(i=;i<52;i++)
{
	strcpy(card[i].suit,pSuit[i/13]);
	strcpy(card[i].face,pFace[i%13]);
}

char *pSuit[]={"Spades","Hearts","Clubs","Diamonds"};
cahr *pFace[]={"A","2","3","4","5,"6","7","8","9","10","Jack","Queen","King"};

2つの方法があります
  • 出力ごとに乱数が生成され、出力されるのはこの乱数に対応するカード欠陥である--乱数を生成する数が増加するにつれて、新しい乱数が発生した乱数と同じになる可能性がますます大きくなり、アルゴリズム遅延問題
  • が発生する可能性がある.
  • は52枚のカードと札面を順番に排出し、ランダムに乱す.ループ毎に0~51の乱数jが生成され、resultの中の法列番号result[i]とランダムに選択されたresult[j]とが交換される.この方法はより効率的である
  • void Initialize(int result[])   //       
    {
    	int i;
    	for(i=0;i<52;i++)
    	{
    		result[i]=i;
    	}
    }
    
    void Shuffle(int result[]) 
    //         ,    
    {
    	int i,j,temp;
    	srand(time(NULL));
    	for(i=0;i<52;i++)
    	{
    		j=rand()%52;
    		temp=result[i];
    		result[i]=result[j];
    		result[j]=temp;
    	}
    }
    

    完全なコード
    #include
    #include
    #include
    #include
    typedef struct card
    {
    	char suit[10];    //  
    	char face[10];    //  
    }CARD;
    void Initialize(int result[])   //       
    {
    	int i;
    	for(i=0;i<52;i++)
    	{
    		result[i]=i;
    	}
    }
    
    void Shuffle(int result[])    //         ,    
    {
    	int i,j,temp;
    	srand(time(NULL));
    	for(i=0;i<52;i++)
    	{
    		j=rand()%52;
    		temp=result[i];
    		result[i]=result[j];
    		result[j]=temp;
    	}
    }
    void FillCard(CARD card[]);
    void Deal(CARD card[], int result[]);  //  
    void Initialize(int result[]);     //       
    void Shuffle(int result[]);        //         ,    
    main()
    {
    	CARD card[52];
    	int result[52];
    	FillCard(card);          //                card
    	Initialize(result);      //         result 
    	Deal(card,result);       //        
    	Shuffle(result);         //  
    	printf("    :
    "
    ); Deal(card,result); // }