| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4523 人关注过本帖
标题:52张扑克牌打乱顺序,求大神帮助
只看楼主 加入收藏
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
结帖率:80%
收藏
 问题点数:0 回复次数:13 
52张扑克牌打乱顺序,求大神帮助
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
int main()
{
    char c[4];
    int num[13]={0};
    int i,j;
    srand((unsigned)time(NULL));

    for(i=0;i<13;i++)                        //输出不同的十三个数,1到13
    {
        num[i]=rand()%13+1;
        for(j=0;j<i;j++)
        {
            if(num[i]=num[j])
                num[i]=rand()%13+1;   
        }
    }
    for(i=0;i<4;i++)                           //十三张牌每张赋不同花色,并输出
    {
        c[i]=rand()%3+4;
        for(j=0;j<13;j++)
            printf("%c %d\t",c[i],num[j]);
    }
    return 0;
}

总是有相同的牌。感觉就是输出不同的随机数有问题,扑克牌花色差一种,求大神支招,谢谢

[ 本帖最后由 ·charles 于 2015-4-26 23:27 编辑 ]
搜索更多相关主题的帖子: 扑克牌 include 
2015-04-26 23:25
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
错误太多,不好一一指出,我就按你的方式给个消除13个数重复的算法吧(你这是效率最低的免重复算法,说不定长期循环,好像死循环了)
    for(i=0;i<13;i++)                        //输出不同的十三个数,1到13
    {
        num[i]=rand()%13+1;
        for(j=0;j<i;j++)if(num[i]==num[j])i--;   
    }

接下来,你同样要对花色随机是否重复进行判断,不同的是你要设定个开关,通过该开关决定是否打印该花色的前面随机生成好的13张牌

[ 本帖最后由 wmf2014 于 2015-4-27 00:16 编辑 ]

能编个毛线衣吗?
2015-04-27 00:12
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
收藏
得分:0 
回复 2楼 wmf2014
嗯嗯。谢谢。想这种不同随机数的算法想了好久,膜拜大神!!
弱弱地问一句,就这道题,有没有更有效的算法,只求思路,不求代码。

编程!编程!!编程!!!
重要的事情说三遍!!!!
2015-04-27 00:26
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
有的,你直接用一个52的数组,获取免重复的52个0-51的数值,然后显示这个数组,花色等于“值/13+3”,而牌面等于“值%13+1”,给个不随机的示例如下(顺序显示花色和牌面):
#include "stdio.h"
void main()
{
    int i;
    for(i=0;i<52;i++)
        printf("%c%d\t",i/13+3,i%13+1);
    printf("\n");
}

能编个毛线衣吗?
2015-04-27 00:43
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
收藏
得分:0 
不好意思,学c语言不久,不是很熟练,刚刚做完。谢谢您,真心佩服!!
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
int main()
{
    int a[52],i,j;
    srand((unsigned)time(NULL));
    for(i=0;i<52;i++)
    {
        a[i]=rand()%52+1;
   
        for(j=0;j<i;j++)
        {
            if(a[i]==a[j])
                i--;
        }
    }
    for(i=0;i<52;i++)
        printf("%c%d\t",a[i]/13+3,a[i]%13+1);
    return 0;
}

编程!编程!!编程!!!
重要的事情说三遍!!!!
2015-04-27 01:06
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
收藏
得分:0 
回复 5楼 ·charles
谢谢您,麻烦帮我看看还可以修改什么吗

编程!编程!!编程!!!
重要的事情说三遍!!!!
2015-04-27 01:12
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
我的代码如下:
#include "stdio.h"
#include "stdlib.h"
void main()
{
    int i,j,s,a[52];
    for(i=0;i<52;i++)a[i]=i;
    for(i=0;i<52;i++)
    {
        s=i+rand()%(52-i);//这是效率最高的免重复算法,永远不会产生相等的随机值
        j=a[i];
        a[i]=a[s];
        a[s]=j;
        printf("%c%d %d\t",a[i]/13+3,a[i]%13+1,a[i]);
    }
    printf("\n");
}

能编个毛线衣吗?
2015-04-27 01:12
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 5楼 ·charles
你的牌面值是1-52,这会导致后面算出错误的结果,应该是0-51,“a[i]=rand()%52+1”改为“a[i]=rand()%52”。

能编个毛线衣吗?
2015-04-27 01:15
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
收藏
得分:0 
回复 7楼 wmf2014
  s=i+rand()%(52-i);//这是效率最高的免重复算法,永远不会产生相等的随机值


菜鸟表示看不懂,大神详解o(╯□╰)o

编程!编程!!编程!!!
重要的事情说三遍!!!!
2015-04-27 01:21
·charles
Rank: 2
等 级:论坛游民
帖 子:67
专家分:48
注 册:2015-3-23
收藏
得分:0 
回复 8楼 wmf2014
嗯嗯,您讲得好详细,真心谢谢。
这个我看懂了,不过您的代码里面求随机数那一步是怎么回事?怎么感觉会重复的样子,,,虽然我运行了代码,的确不重复

编程!编程!!编程!!!
重要的事情说三遍!!!!
2015-04-27 01:24
快速回复:52张扑克牌打乱顺序,求大神帮助
数据加载中...
 
   



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

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