当前位置: 代码迷 >> C语言 >> 扑克牌洗牌问题
  详细解决方案

扑克牌洗牌问题

热度:350   发布时间:2006-07-01 21:52:52.0
你所说的问题是不会发生的,这和指针没关系,我出代码你可以尝试看看
srand(unsigned(time(NULL)));
int card[54],t,r,i;
for(i=0;i<54;i++)
{
card[i]=i;
}
for(i=0;i<54;i++)
{
t=card[i];
r=(int)(54*rand()/(RAND_MAX+1.0));
t=card[r];
card[r]=i;
card[i]=t;
}
----------------解决方案--------------------------------------------------------
我教楼主一个办法:
第1步:先定义一个数组a[54](拥有54个元素初值均为零)
第2步:执行 rand()%54 得到 0~53 之间的一个数i
第3步:检查 a[i] 是不是等于零?如果a[i]==0,说明
这是一张新牌。如果a[i]!=0,说明随机数重复了,于是
返回第2步。
第4步:新牌的处理如下
1.令a[i]=1;
2.根据i的值兑换成某张具体的扑克牌
3.兑换关系必须事先设定好
第5步:对获得的牌计数,若小于54返回第2步
否则停机。

----------------解决方案--------------------------------------------------------
星星,你不觉得dqh3000的方法比你的要好么
----------------解决方案--------------------------------------------------------
回复:(神vLinux飘飘)星星,你不觉得dqh3000的方法比...
以下是引用神vLinux飘飘在2006-7-1 21:59:05的发言:
星星,你不觉得dqh3000的方法比你的要好么




dqh3000的方法有问题哦:
1不见了,
48似乎有2个!

----------------解决方案--------------------------------------------------------
今天真见鬼了,连记事本的剪帖版都粘不上来!

管理员太有本事啦!!!

所以害得我不得不麻烦大家下载!不好意思。


----------------解决方案--------------------------------------------------------
可能是他的程序写得不好,但是思想肯定是正确的
----------------解决方案--------------------------------------------------------
//总算用word粘贴上来了
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main()
{
int card[54],t,r,i;
srand(time(NULL));
for(i=0;i<54;i++)
{
card[i]=i;
}
for(i=0;i<54;i++)
{
t=card[i];
r=(int)(54*rand()/(RAND_MAX+1.0));
t=card[r];
card[r]=i;
card[i]=t;
}
for(i=0;i<54;i++)
printf("%d\t",card[i]);
printf("\n");
}
运行实况
9 33 45 48 49 48 15 17 27 49
0 50 31 20 14 52 2 18 28 38
44 44 4 27 45 41 33 13 10 46
23 43 35 29 46 53 28 39 16 3
24 36 47 41 12 25 43 51 24 26
19 6 53 34
Press any key to continue

----------------解决方案--------------------------------------------------------

回复:(神vLinux飘飘)可能是他的程序写得不好,但是思...
以下是引用神vLinux飘飘在2006-7-1 22:24:01的发言:
可能是他的程序写得不好,但是思想肯定是正确的

扯淡。


----------------解决方案--------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define TIMES 1000
#define CARD_NUMBER 54

int main(void){
int card[CARD_NUMBER],i,a,b,temp;
time_t t;
srand( (unsigned)time(&t) );
for(i=0;i<CARD_NUMBER;card[i]=i++);
for(i=0;i<TIMES;i++){
temp = card[a=rand()%CARD_NUMBER];
card[a] = card[b=rand()%CARD_NUMBER];
card[b] = temp;
}
for(i=0;i<CARD_NUMBER;i++)
printf("card[%d]=%d\t",i,card[i]);
printf("\n");
return 0;
}
----------------解决方案--------------------------------------------------------
以下是引用神vLinux飘飘在2006-7-1 22:53:45的发言:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define TIMES 1000
#define CARD_NUMBER 54

int main(void){
int card[CARD_NUMBER],i,a,b,temp;
time_t t;
srand( (unsigned)time(&t) );
for(i=0;i<CARD_NUMBER;card[i]=i++);
for(i=0;i<TIMES;i++){
temp = card[a=rand()%CARD_NUMBER];
card[a] = card[b=rand()%CARD_NUMBER];
card[b] = temp;
}
for(i=0;i<CARD_NUMBER;i++)
printf("card[%d]=%d\t",i,card[i]);
printf("\n");
return 0;
}
晕,理论上没错,但是实践中却出了错啊,希望你来了看到贴后自己运行一下,我不知道是我的机子问题还是怎么,card的值居然是负数,而且全是一样的!!!!
----------------解决方案--------------------------------------------------------
  相关解决方案