2013-02-27 60 views
0

游戏:
有一个框分成五个部分。盒子里面坐着鼠标。坐在箱子附近的猫。
每回合,猫把他的爪子放在部分。
1)如果猫用鼠标将他的爪子放在部分上,则游戏结束
2)否则,鼠标移动到相邻部分,包括猫爪下的部分
我正在尝试找到一个战略猫,将赢得最少的动作(平均)。
链 - 循环重复猫的动作序列。
下面的函数返回的移动平均数来赢得对于给定的链:java随机。奇怪的行为

public static double computePerformanceForChain(String chain) 
{ 
    final int iterationsCount = 10000; 
    int catPos, mousePos,steps=0; 
    Random random = new Random(System.currentTimeMillis()); 
    for(int i=0; i<iterationsCount; i++) 
    { 
     mousePos=random.nextInt(5); 
     for(int j=0;;j++) 
     { 
      catPos=Integer.parseInt(String.valueOf(chain.charAt(j%chain.length()))); 
      steps++; 
      if(catPos==mousePos) break; 
      if(mousePos==0) mousePos=1; 
      else if(mousePos==4) mousePos=3; 
      else mousePos+=random.nextInt(2)*2-1; 
     } 
    } 
    return (double)steps/iterationsCount; 
} 

例如,computePerformanceForChain("1133")返回大约3.
但对于链"23"函数循环。
这是怎么发生的?谢谢。

+0

你是什么意思的“功能**循环**”? – Vrushank 2013-02-27 06:53:20

+0

如果你的值是从0开始的,那么它可能会不幸地在'0'和'1'之间跳动。当'catPos'没有时,不能保证你会在'2'或'3'上登陆。 – pickypg 2013-02-27 06:54:29

+0

“函数循环”表示无限循环。 – 2013-02-27 06:59:28

回答

2

答案很简单:没有保证执行将走出内环
退房内环:

for(int j=0;;j++) { 
     catPos=Integer.parseInt(String.valueOf(chain.charAt(j%chain.length()))); 
     steps++; 
     if(catPos==mousePos) break; 
     if(mousePos==0) mousePos=1; 
     else if(mousePos==4) mousePos=3; 
     else mousePos+=random.nextInt(2)*2-1; 
    } 

所以,在每次迭代mousePos的奇偶性改变。所以,如果:

  • mousePos获得最初分配给奇数
  • chain是偶奇序列,如“23”

然后catPos将永远不等于mousePos和循环永远不会结束。

简而言之:如果鼠标最初处于奇数段(例如第3节),那么cat无法用2-3链捕捉它,并且会无限重复这个序列。

+0

当然,你是绝对正确的,谢谢! – 2013-02-27 07:05:38

1

你的猫的序列使猫从偶数平方移到奇数平方,反复进行,总是偶数,奇数,偶数,奇数。鼠标,因为它总是移动到相邻的广场也总是从甚至奇数甚至奇数。因此,鼠标在右边的正方形上有50/50的机会。如果在猫移动到偶数正方形时鼠标位于奇数正方形上,那么当猫尝试奇数正方形时,鼠标移动到偶数正方形。

在这种情况下,猫将永远不会抓住鼠标。

对于任何偶数编号的解决方案,猫总是从奇数到偶数到奇数到偶数都是如此。