标题:扑克牌洗牌问题
只看楼主
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
是么?我是在LINUX下编译并且运行的,现在换WINDOWS看看

淘宝杜琨
2006-07-01 23:47
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
一切正常,没有出现你说的问题
环境: WINDOWS XP
C-FREE3.5

淘宝杜琨
2006-07-01 23:50
dqh3000
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-7-1
得分:0 
啊,我写错了嘛,竟然都没仔细看,真失败
for循环的赋值会有问题,这样嘛

r=(int)(54*rand()/(RAND_MAX+1.0));
t=card[r];
card[r]=card[i];
card[i]=t;

2006-07-02 00:32
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
以下是引用神vLinux飘飘在2006-7-1 22:53:45的发言:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define TIMES 1000 //为何不取54取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;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-02 05:42
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
[QUOTE]#define TIMES 1000 //为何不取54取1000?理论依据?调试时凑的?[/QUOTE]

俺估么着上大过 54*3 就可

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-07-02 06:32
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
呵呵,TIMES是洗牌的次数,次数越高,那么牌就洗得越散,这个和现实生活中的洗牌是一个道理
老K说 54*3,那也行啦~~

淘宝杜琨
2006-07-02 07:37
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 

/*洗牌*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 52 //牌的张数(去掉正副令)

void Show(int *);
int Get(int *);

int main()
{
int card[NUM+1]={0}; //0:空闲
int i;
srand(time(NULL)); //避免雷同
for(i=0;i<NUM;i++)
card[i]=Get(card);
//效果检验:
Show(card);
return 0;
}

int Get(int *s)
{
int card,*p;
again:
p=s;
card=1+rand()%NUM;
while(*p)
{
if(card==*p++)goto again;
}
return card;
}

void Show(int *p)
{
int counter=0;
char suit[][8]={"spade ","heart ","diamond","club "};
while(*p)
{ char c=(*p)-1;
printf("%s %-2d ",suit[c%4],1+c/4);
++p;++counter;
if(counter%4==0)printf("\n");
}
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-02 08:56
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
以下是引用lxs5216在2006-7-1 23:26:33的发言:
晕,理论上没错,但是实践中却出了错啊,希望你来了看到贴后自己运行一下,我不知道是我的机子问题还是怎么,card的值居然是负数,而且全是一样的!!!!

没错.要错也是你的问题


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-02 08:59
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 

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

#define TIMES 1000
#define CARD_NUMBER 54
void prt(int card[]);
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;
}
prt(card);
printf("\n");
return 0;
}

void prt(int a[])
{
int i;
for(i=0;i<CARD_NUMBER;i++)
{

switch(a[i]/13)
{
case 0 : printf(" spade : %d ",a[i]%13); break;
case 1 : printf(" heart : %d ",a[i]%13); break;
case 2 : printf(" diamond: %d ",a[i]%13); break;
case 3 : printf(" club : %d ",a[i]%13); break;
default : printf(" BOSS : %d ",a[i]%13);
}
if((i+1)%4==0) printf("\n");

}
}



拿小神的程序直接写的...

[此贴子已经被作者于2006-7-2 9:31:44编辑过]


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-02 09:28
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 

/*洗牌(更简短)*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 52 //牌的张数(去掉司令)

void Show(int *);

int main()
{
int card[NUM+1]={0}; //0:空闲
int i=0,No; //No:某张牌的位次
srand(time(NULL)); //避免雷同
while(i<NUM)
{
No=rand()%NUM;
if(card[No])continue;
card[No]=++i;
}
//效果检验:
Show(card);
return 0;
}

void Show(int *p)/*按逆置换理解还可获另一组解*/
{
int counter=0;
char suit[][8]={"spade ","heart ","diamond","club "};
while(*p)
{ char c=(*p)-1;
printf("%s %-2d ",suit[c%4],1+c/4);
++p;++counter;
if(counter%4==0)printf("\n");
}
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-07-02 10:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-76109-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046562 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved