c语言实现模拟洗牌
首先保存一副扑克牌struct sPAI{charsuit[10];//储存花色charface[10];//储存牌面}card[52];//共52张牌
·
首先保存一副扑克牌
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"};
有两种方法
- 每次输出时就生成一个随机数,输出的就是这个随机数所对应的牌
缺陷——随着生成随机数的数量增加,新的随机数与已产生的随机数相同的可能性越来越大,有可能出现算法延迟问题 - 现将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<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
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("在洗牌后:\n");
Deal(card,result); //输出洗牌后的结果
}
更多推荐
已为社区贡献1条内容
所有评论(0)