随机java。奇怪的行为

时间:2013-02-27 06:45:28

标签: java random

游戏:
有一个盒子分为五个部分。盒子里面放着鼠标。坐在箱子附近的猫 每转一圈,猫都把爪子放在那个部分上 1)如果猫用鼠标将爪子放在该部分,则游戏结束 2)否则,鼠标移动到相邻部分,包括猫爪下面的部分 我正试图寻找一种能以最少的动作(平均)获胜的策略猫 链 - 循环重复猫的移动顺序。
以下函数返回给定链的平均获胜次数:

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"函数循环 为什么会这样?感谢。

2 个答案:

答案 0 :(得分: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链捕获它并且将无限重复此序列。

答案 1 :(得分:1)

你对猫的序列让猫从一个偶数平方移动到一个奇数平方,并重复这样做,总是偶数,奇数,偶数,奇数。鼠标,因为它总是移动到相邻的方块也总是从偶数到奇数到偶数到奇数。因此,鼠标将在右方块上启动的几率为50/50。如果当猫移动到偶数方格时鼠标位于奇数方格上,则当猫尝试奇数方格时,鼠标移动到偶数方格。

在这种情况下,猫永远不会捕捉到鼠标。

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