c語言洗牌算法


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
void shuffle(char poker[54][7])
{
char temp[6]="";
for (int i = 0; i < 54; i++)
{
int j = rand() % 54;
strcpy(temp, poker[i]);
strcpy(poker[i], poker[j]);
strcpy(poker[j], temp);
}
}
int main(void)
{
srand(time(NULL));
char poker[54][7];
/*初始化*/
for (int i = 0; i < 52; i++)
{
if((i+1)%4==0) strcpy(poker[i], "方");
else if ((i + 1) % 4 == 1)strcpy(poker[i], "草");
else if ((i + 1) % 4 == 2)strcpy(poker[i], "紅");
else strcpy(poker[i], "黑");
}
for (int i = 0; i < 52; i++)
{
int j = (i + 1)/ 4;
switch (j)
{
case 0:strcat(poker[i], "A"); break;
case 10:strcat(poker[i], "J"); break;
case 11:strcat(poker[i], "Q"); break;
case 12:strcat(poker[i], "K"); break;
default:char temp[3]="";
_itoa(j+1,temp,10);
strcat(poker[i], temp); break;
}
}
strcpy(poker[52],"小王");
strcpy(poker[53], "大王");
shuffle(poker);
for (int i = 0; i < 54; i++)
{
printf("%s ", poker[i]);
/*方便顯示*/
if ((i + 1) % 13 == 0)printf("\n");
}
return 0;
}

頭文件:#include <time.h>
定義函數:time_t time(time_t *t);
函數說明:此函數會返回從公元 1970 年1 月1 日的UTC 時間從0 時0 分0 秒算起到現在所經過的秒數。如果t 並非空指針的話,此函數也會將返回值存到t 指針所指的內存。
返回值:成功則返回秒數,失敗則返回-1。

所以上程序中time(Null)起到產生一個永遠不重復的數字的作用。

srand()和rand(),srand()就是給rand()提供種子,這兩個函數在#include<stdlib.h>中

void srand(
   unsigned int seed 
);
int rand( void );

其中seed的值不同rand()就會返回不同的隨機數。

所以rand()作用就是每次都產生不同的隨機數。另外一定要注意,每執行一次rand()函數,程序都會同時重新執行一次srand(seed),如果seed有變化,rand()就會生成

一個和上次執行不一樣的隨機數。因為上面程序定義了srand(time(NULL)),所以每次調用執行rand()都會產生一個新的隨機數。

char *_itoa(
   int value,
   char *str,
   int radix 
);           //value是要轉化的int值,str是轉化完要存放的位置的起始地址,radix表示轉化時的進制如2,8,10,16等

程序思路:

用字符串數組表示54張牌,0-3元素為A,依次類推,52和53號元素表示大小王。洗牌的問題轉化為將數組中每個元素都與另一個隨機元素交換值的問題。繼而轉化為每次交換產生一個0~53的隨即數字的問題。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM