当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 关于C语言随机函数的问题,附上所编的BlackJack的游戏
帖子发表于 : 2010-04-14 19:27 

注册: 2008-11-08 9:11
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*BlackJack的游戏,先玩家和电脑各扔2次骰子,电脑只能给出第一次扔的数。然后玩家开始扔 ,按1为扔骰子,0为不扔,然后电脑再扔。电脑扔出的总数当大于17时,就停止继续扔。然后看谁的总数最接近21,谁就获胜。但是总数超过21的话,谁就输了。*/
 void rolldice(int t[]) //随机函数
   {
     int n;
     srand(time(NULL));//骰子随机数的seed
     for(n=0;n<=6;++n)
       {
         t[n]=1+rand()%6;//骰子1-6的随机数
        }
   }

   int Player(long sumP,int t[])//玩家
      {
     srand(time(NULL));//t[]的番号的随机数的种子
     int input;
     long player;
     printf("玩家扔骰子。\n");
     do
        {
         //rolldice (t);//随机数重置
          printf("扔骰子or放弃?(扔骰子1 放弃0)\n");
          scanf("%d",&input);
     
          if(input==1)
              {
                player=t[0+rand()%5];
               sumP+=player;
                printf("本次点数:%ld。总数:%ld\n",player,sumP);
                if(sumP>21)
                  {
                    printf("玩家输了。\n");
                    return 0;
                  }
           }
          else if(input==0)
             {
               return sumP;
             }
          else{return 0;}
         }while(input==1);
        return sumP;
      }
   
   int Dealer(long sumD,long d,long dealer,int t[])//电脑
   {
     srand(time(NULL));//t[]的番号的随机数的种子
     printf("电脑扔骰子。\n");
     printf("第一和第二次扔的点数:%ld和%ld。总数:%ld\n",d,dealer,sumD);
     
     while(sumD<=17)
       {
         //rolldice (t);/*随机数重置(问题在这,要加上这一个重置随机函数的话,电脑的点数输出就是同一个随机函数,也就是说所有随机函数都是相同的,为什么?) */
         dealer=t[0+rand()%5];//t[]的番号的随机数
         sumD+=dealer;
         printf("本次点数:%ld。总数:%ld\n",dealer,sumD);
           if(sumD>21)
             {
                 printf("电脑输了。\n");
                 return 0;
             }
       }
     return sumD;
   }


   int main()
   {
     long sumP,sumD;
     long player,p;
     long dealer,d;
     int t[6],n;
     
      srand(time(NULL));//t[]的番号的随机数的种子
     printf("BlackJack游戏开始。\n开始扔骰子。\n");
     
     rolldice(t);//随机数初始化
    
     d=t[0+rand()%5];//电脑第一次
     
     dealer=t[0+rand()%5];//电脑第二次
     
     p=t[0+rand()%5];//玩家第一次
     
     player=t[0+rand()%5];//玩家第二次
     
     sumP=player+p;
     sumD=dealer+d;
     printf("电脑第一和第二次扔的点数:%ld和??。\n",d);
     printf("玩家第一和第二次扔的点数:%ld和%ld。总数:%ld\n",p,player,sumP);
    
     sumP=Player(sumP,t);
       if (sumP==0)
        {
            return 0;
         }
     else
        {
            sumD=Dealer(sumD,d,dealer,t);
            if (sumD==0)
               {
                return 0;
             }
          else
             {
              if(sumP>sumD)
                 {                         
                    printf("玩家获胜。\n");
                 }
              if(sumP<sumD)
                 {
                    printf("电脑获胜。\n");
                 }
              else if(sumP==sumD)
                 {
                    printf("玩家和电脑平手。\n");
                 }
             }
      }
      return 0;   
   }

   /*By 立命馆大学 情报理工学部 智能情报学科 2年级 刘海龙*/

 

问题写在代码里


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 关于C语言随机函数的问题,附上所编的BlackJack的游戏
帖子发表于 : 2010-04-15 11:04 
头像

注册: 2005-10-16 8:26
帖子: 1937
地址: 地球
送出感谢: 0 次
接收感谢: 1
哈哈,这是个典型的随机数seed函数使用错误


_________________
http://www.pandabang.info


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 关于C语言随机函数的问题,附上所编的BlackJack的游戏
帖子发表于 : 2010-04-15 11:08 
头像

注册: 2005-10-16 8:26
帖子: 1937
地址: 地球
送出感谢: 0 次
接收感谢: 1
我们把两段函数抽出来单看
引用:
while(sumD<=17)
{
rolldice (t);
....
}
return sumD;
}

引用:
void rolldice(int t[])
{
int n;
srand(time(NULL));
for(n=0;n<=6;++n)
{
t[n]=1+rand()%6;
}
}

你想在while循环里每次都初始化一下随机数(rolldice),但是实际上你的随机数初始化函数srand是以系统当前时间为参数的,这个系统时间的精度估计是毫秒

但是while循环执行的速度很快,在1ms内早就执行完一次了,下一次进入循环体,再次调用srand的时候,用的还是相同的时间参数,自然你的随机数每次都是一样的了

为了验证这一点,你可以在while循环里,加上一个sleep,然后测试一下输出还是不是一样的就明白了 :em05
引用:
while(sumD<=17)
{
sleep(1); // 让系统等待一秒
rolldice (t);
.....
}


_________________
http://www.pandabang.info


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 关于C语言随机函数的问题,附上所编的BlackJack的游戏
帖子发表于 : 2010-04-15 17:28 

注册: 2008-11-08 9:11
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
非常感谢goldfox_79。
自我总结下,也是seed的问题。
设置了2个随机函数,1,是t[]里面内容的随机函数,和t[n]里番号n的随机函数。
本来这样设置就是为了避免time相同,造成输出数据相同
但是没有考虑到t[n]里番号n的随机函数的time也是相同的,所以n也是相同的。
现在问题想明白了,谢谢


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译