洗扑克牌算法

时间:2021-05-22 11:11:00

一副扑克共有52张,4中花色

如果我们随机的生成一个数字和花色的话,可能会产生和前面一样的数据。这里我们采用随机换牌的方法洗牌

(1)先按顺序生成一副扑克

(2)产生一个0~51的随机数,将此随机数作为扑克的下标与第i张牌交换,然后随机的交换52次结束。就会得到一个打乱顺序的扑克

其中ASCII中的3,4,5,6对应着扑克中的红桃,方片,梅花,黑桃

实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct card
{
int sign; //表示花色
char number; //表示数字
}card;

card oneCard[52];


void display()
{
for(int i=0; i<52; i++)
{
if(i%13 ==0)
{
printf("\n");
}
printf("%c%c\t",oneCard[i].sign,oneCard[i].number);
}
printf("\n");
}

void shuffle()
{
int sign,temp,random;
card tempCard;
sign = 2;
for(int i=0; i<52; i++)
{//先生成一副扑克
if(i%13 == 0)
{
sign++;
}
oneCard[i].sign = sign;
temp = i%13;
switch(temp)
{
case 0:
oneCard[i].number = 'A';
break;
case 9:
oneCard[i].number = '0'; //这里用0当10
break;
case 10:
oneCard[i].number = 'J';
break;
case 11:
oneCard[i].number = 'Q';
break;
case 12:
oneCard[i].number = 'K';
break;
default :
oneCard[i].number = temp+'1';
}
}

printf("洗牌前:\n");
display();

//将扑克打乱顺序
srand(time(0));
for(i=0; i<52; i++)
{//任意交换52次达到洗牌的目的
random = rand()%52;
tempCard = oneCard[random];
oneCard[random] = oneCard[i];
oneCard[i] = tempCard;
}

}
void main()
{
shuffle();
printf("洗牌后:\n");
display();
}

运行结果:

洗扑克牌算法