| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1238 人关注过本帖
标题:rand()函数的问题
只看楼主 加入收藏
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:10 
rand()函数的问题
题目是写一个扑克牌的发牌程序,并按照打牌的规则对手中的牌排序输出。我设计成斗地主的发牌,想用rand函数来做。结果。。。。。。每位玩家手里都有好多炸弹。。。就像牌没有洗开一样。我实在是不清楚是我程序的问题,还是rand函数本身存在缺陷了。。求助啊。。。拜托各位了
程序代码:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
///发牌函数/////////这里肯定有问题,不然不会满手的炸弹
void deal_poker(int num[],int poker[])
{
    int rand_num;
    for(int i=0;i<18;i++)
    {
        srand((int)time(0));
        rand_num=(rand())%15;
        while(4==num[rand_num])
        {
            srand((int)time(0));
            rand_num=(rand())%15;//对随机得到的数字所代表的牌已发出的情况进行处理
        }
        num[rand_num]++;
        switch(rand_num)//按照斗地主规则中牌的大小对poker赋值,以便排序
        {
        case 0:poker[i]=14;break;
        case 1:poker[i]=15;break;
        case 13:poker[i]=16;break;
        case 14:poker[i]=17;break;
        default:poker[i]=rand_num+1;break;
        }
    }
}
///排序函数
void rank(int poker[])
{
    int temp,k;
    for(int i=0;i<18;i++)
    {
        k=i;
        for(int j=i+1;j<18;j++)
        {
            if(poker[j]<poker[k])k=j;
        }
        if(k!=i)
        {
            temp=poker[k];
            poker[k]=poker[i];
            poker[i]=temp;
        }
    }
}
///输出函数
void print(int poker[])
{
    for(int i=0;i<18;i++)
    {
        switch(poker[i])
        {
        case 11:printf("%7s","J");break;
        case 12:printf("%7s","Q");break;
        case 13:printf("%7s","K");break;
        case 14:printf("%7s","Ace");break;
        case 15:printf("%7s","2");break;
        case 16:printf("%7s","Joker1");break;
        case 17:printf("%7s","Joker2");break;
        default:printf("%7d",poker[i]);break;
        }
        if(0==(i+1)%6)printf("\n");
    }
    printf("\n");
}
void main()
{
    char s;
    int num[15]={0};//记录每种牌的个数(为了区分大小王所以用了15个种类)
    int poker[18]={0};//记录手牌
    num[13]=3;
    num[14]=3;
    printf("说明:\n手牌按照多地主的规则从小到大排序Joker1代表大王,Joker2代表小王,请输入s开始发牌\n");
    while(EOF!=scanf("%c",&s))
    {
        for(int i=0;i<3;i++)
        {
            printf("玩家%d的手牌:\n",i+1);
            deal_poker(num,poker);
            rank(poker);
            print(poker);
        }
    }
}
搜索更多相关主题的帖子: 函数 
2012-10-31 23:07
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:13 
rand()函数需要初始化吧
MSDN:
srand( (unsigned)time( NULL ) );
放在程序开始处

应该放在循环外吧

[ 本帖最后由 wp231957 于 2012-11-1 09:18 编辑 ]

DO IT YOURSELF !
2012-11-01 08:45
berchan
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2012-10-17
收藏
得分:7 
rand_num=(rand())%15;放到for的外面,还有随机数0-14之间正好15类牌,可以不用switch语句
2012-11-01 14:53
berchan
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2012-10-17
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>

void deal_poker(int num[],int poker[])
{
    int rand_num;
    int i;
    srandom((unsigned int)time(NULL));
    for( i=0;i<17;i++)
    {

        rand_num=random()%15;
        while((rand_num==13)&&(num[rand_num]==1))//加的这两个for好像不管用
          {
            srandom((unsigned int)time(NULL));
            rand_num=random()%15;
          }
        while((rand_num==14)&&(num[rand_num]==1))
          {
            srandom((unsigned int)time(NULL));
            rand_num=random()%15;
          }
        while(4==num[rand_num])
        {
            srandom((unsigned int)time(NULL));
            rand_num=random()%15;//对随机得到的数字所代表的牌已发出的情况进行处理
        }
        num[rand_num]++;
        poker[i]=rand_num+1;
    }
}
///排序函数
void rank(int poker[])
{

 int temp,k;
    int i;
    for( i=0;i<17;i++)
    {
        k=i;
        int j;
        for( j=i+1;j<17;j++)
        {
          if(poker[k]<poker[j]){temp=poker[k];poker[k]=poker[j];poker[j]=temp;}
        }
    }
}
///输出函数
void print(int poker[])
{
  int i;
  for(i=0;i<17;i++)
    {
        switch(poker[i])
        {
        case 11:printf("%7s","J");break;
        case 12:printf("%7s","Q");break;
        case 13:printf("%7s","K");break;
        case 14:printf("%7s","Joker1");break;
        case 15:printf("%7s","Joker2");break;
        case 1:printf("%7s","Ace");break;
        default:printf("%7d",poker[i]);break;
        }
        if(0==(i+1)%6)printf("\n");
    }
    printf("\n");
}
void main()
{
    char s;
    int num[15]={0};//记录每种牌的个数(为了区分大小王所以用了15个种类)
    int poker[17]={0};//记录手牌
    //num[13]=3;
    //num[14]=3;
    printf("\ninstuction\n");
    int m=0;
    do
      {
        printf("player%dpoker:\n",m+1);
        deal_poker(num,poker);
        rank(poker);
        print(poker);
        m++;
   }while(m<3);
}




我将程序改了一下,但是也有个问题解决不了,就是大小王个数问题
2012-11-01 15:12
berchan
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2012-10-17
收藏
得分:0 
我这个问题解决啦,忘了嵌套
2012-11-02 18:01
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 2楼 wp231957
我是用time为rand做种子的,在循环内是为了让每次的种子不同。
2012-11-02 23:31
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 4楼 berchan
刚刚我运行了一下。。。仍然是满手的炸弹牌。。很不合理,我觉得这里有什么深入的问题,是与rand的产生有关的。rand产生的数字并不是完全随机的。我之所以用15个累,就是为了解决大小王的问题,我把大王跟小王分为两个类了。。。
2012-11-02 23:44
落雨and无声
Rank: 2
等 级:论坛游民
帖 子:48
专家分:30
注 册:2012-10-5
收藏
得分:0 
回复 2楼 wp231957
好吧,我试了试。原来rand函数没必要一直做新种,一直做新种反而容易引起错误。你是对的。谢谢了
2012-11-03 01:59
berchan
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2012-10-17
收藏
得分:0 
给你看个文件,上面关于rand的讲解很详细
用C语言产生随机数.zip (9.18 KB)
2012-11-05 11:01
還是那首歌
Rank: 1
等 级:新手上路
帖 子:3
专家分:6
注 册:2012-8-4
收藏
得分:0 
回复 9楼 berchan
很好的资料

事重于做!学致以用!
2012-11-05 11:50
快速回复:rand()函数的问题
数据加载中...
 
   



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

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