2013-06-27 50 views
6

我正在處理一個我有點困惑的問題。這個問題說,想象你在二戰期間是英國空軍的將軍。你有100架飛機離開捍衛英國。隨着每架飛機的飛行,每架飛機都有50%的機會被德軍的防空炮擊落,所以每次飛行任務都會損失大約一半的飛機。你必須編寫一個程序,估計每次任務後有多少架飛機能夠存活下來,以及在你的所有飛機被擊落之前可以運行多少次任務。

RandomGenerator - 丟失50%的飛機模擬

我的程序不工作,我不知道它有什麼問題,所以我猜英格蘭有麻煩。我試圖用兩個while循環來解決這個問題。只要你有飛機離開,他們就會在另一個任務中發送。內部while循環模擬實際任務。在while循環存在之後,飛機總數現在是倖存的飛機。

import acm.program.*; 
import acm.util.*; 

public class MissionPlanes extends ConsoleProgram{ 
public void run(){ 

    int planes = 100; /* total number of planes */ 
    int suvPlanes = 0; /* surviving planes */ 
    int mission = 0;  /* total number of missions */ 
    int planeCounter = 0; /* keeps track of the planes flying over the anti plane gun */ 


    while (planes > 0){ 

     while(planeCounter < planes){ 
      planeCounter++; 
      if(rgen.nextBoolean()){ /* I've tried rgen.nextBoolean() with paramaters and with no paramaters */ 
       suvPlanes += 1; 
        } 
      } 
    planes = suvPlanes; 
    mission++; 
println("The total number of surviving planes you have is " + planes + "after" + missoin + "missions"); 
    } 
    } 
    private RandomGenerator rgen = RandomGenerator.getInstance(); 
     } 
+3

請詳細說明'這行不通'。它以什麼方式不起作用? – Patashu

+0

'nextBoolean'是否帶有任何參數? – Blender

+0

@Patashu沒有任何反應。它不會在屏幕上打印任何內容。我相信我所做的一切都是正確的。 –

回答

8

您必須在外部循環中將planeCounter重置爲0。同樣適用於suvPlanes

while (planes > 0){ 
    planeCounter = 0; 
    suvPlanes = 0; 
    // ... remaining stuff 

如果你不這樣做,在這個週期中,你將最終planeCounter >= planes這樣你就不會執行內部循環的第二次迭代。另一方面,suvPlanes將不會被重置爲0,因此飛機將在第一個循環中永遠保持等於suvPlanes的值,因此您的外部循環將永遠不會終止。

+0

立即嘗試您的建議,並看看我是否可以將其運行。 –

+0

我試過了你的建議。它的工作原理是,「在完成6次任務後,你所擁有的倖存飛機總數爲0」我試圖在第一次任務結束後打印多少架飛機,然後是第二次,然後是第三次,直到我沒有飛機離開。 –

+3

它的作品...它終於有效!非常感謝你的幫助。所以你必須在每個循環開始之前重新設置planeCounter和suvPlanes,因爲它們仍然具有前一個循環的值。是對的嗎? –

3

您應該重置planeCounter和SurvivingPlanes。

+1

你是對的。我沒有意識到,如果你不重置planeCounter和SurvivingPlanes的計數器,它們都將具有前一個循環的值。 –

2

你的類沒有主要方法(我假設你正在運行它自己)。代碼中還有一些邏輯錯誤,以及一些導入語句,我的編譯器至少不滿意。

我已經清理起來,並增加了一個主要方法:

import java.util.Random; 

public class MissionPlanes { 


    public static void main(String[] args){ 
     Random rgen = new Random(); 

     int planes = 100; /* total number of planes */ 
     int suvPlanes = 0; /* surviving planes */ 
     int mission = 0;  /* total number of missions */ 
     int planeCounter = 0; /* keeps track of the planes flying over the anti plane gun */ 


     while (planes > 0){ 

      while(planeCounter < planes){ 
       planeCounter++; 
       if(rgen.nextBoolean()){ /* I've tried rgen.nextBoolean() with paramaters and with no paramaters */ 
       suvPlanes ++; 
       } 
      } 
      planes = suvPlanes; 
      suvPlanes = 0; 
      planeCounter = 0; 
      mission++; 
      System.out.println("The total number of surviving planes you have is " 
      + planes + " after " + mission + " missions"); 
     } 
    } 
} 
+0

非常感謝您的意見。 –

1

我重新修改你的代碼,你可以運行這個`

static Random mRandom = new Random(); 
static int totalPlanes = 100; 

public static void main(String[] args) { 
    run(); 
} 

public static void run() { 
    int planes = totalPlanes; /* total number of planes */ 
    int suvPlanes = 0; /* surviving planes */ 
    int mission = 0; /* total number of missions */ 
    int planeCounter = 0; /* 
         * keeps track of the planes flying over the anti 
         * plane gun 
         */ 

    // it is default that it would encounter the anti plane gun if its in a 
    // mission so don't use planeCounter 
    // and this method assume that the general is sending one plane at a 
    // time 
    while (planes > 0) { 
     if (mRandom.nextBoolean()) {// 50% chance it can survive 
      suvPlanes += 1; 
     } else { 
      // decrease the plane count when is not survived 
      planes -= 1; 
     } 
     mission++; 
     System.out 
       .println("The total number of survived planes you have is " 
         + suvPlanes + " after " + mission 
         + " missions and " + "the original no of plane " 
         + planes); 
    } 
} 

`只要運行得到的答案

+0

感謝您的輸入。 –