关于C语言随机函数的问题,附上所编的BlackJack的游戏

C、C++和Java语言
回复
1019751
帖子: 10
注册时间: 2008-11-08 9:11
送出感谢: 0
接收感谢: 0

关于C语言随机函数的问题,附上所编的BlackJack的游戏

#1

帖子 1019751 » 2010-04-14 19:27

代码: 全选

#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年级 刘海龙*/ 

  
问题写在代码里
头像
goldfox_79
帖子: 1937
注册时间: 2005-10-16 8:26
来自: 地球
送出感谢: 0
接收感谢: 1 次
联系:

Re: 关于C语言随机函数的问题,附上所编的BlackJack的游戏

#2

帖子 goldfox_79 » 2010-04-15 11:04

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

Re: 关于C语言随机函数的问题,附上所编的BlackJack的游戏

#3

帖子 goldfox_79 » 2010-04-15 11:08

我们把两段函数抽出来单看
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);
.....
}
1019751
帖子: 10
注册时间: 2008-11-08 9:11
送出感谢: 0
接收感谢: 0

Re: 关于C语言随机函数的问题,附上所编的BlackJack的游戏

#4

帖子 1019751 » 2010-04-15 17:28

非常感谢goldfox_79。
自我总结下,也是seed的问题。
设置了2个随机函数,1,是t[]里面内容的随机函数,和t[n]里番号n的随机函数。
本来这样设置就是为了避免time相同,造成输出数据相同
但是没有考虑到t[n]里番号n的随机函数的time也是相同的,所以n也是相同的。
现在问题想明白了,谢谢
回复

回到 “C/C++/Java”