2013-02-27 68 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的機會。如果在貓移動到偶數正方形時鼠標位於奇數正方形上,那麼當貓嘗試奇數正方形時,鼠標移動到偶數正方形。

在這種情況下,貓將永遠不會抓住鼠標。

對於任何偶數編號的解決方案,貓總是從奇數到偶數到奇數到偶數都是如此。