2014-04-11 35 views
0

我在Java上很初學,還是很有激情。 我已經做了這個練習:「寫一個模擬器程序,翻轉一個硬幣:一千次然後打印出你有多少次尾巴和多少次頭」 這就是我迄今爲止所做的嘗試。如何翻轉硬幣並顯示尾巴和頭部數字?

import java.util.Random; 
import java.util.regex.Pattern; 

public class coin { 

    public static void main(String [] args) { 

     Random r = new Random(); 
     Pattern tail = Pattern.compile("Tail+"); 
     Pattern head = Pattern.compile("Head+"); 
     String flips = ""; 

     for (int i = 0; i < 1000; i++) { 
      flips += r.nextInt(100) % 2 == 0 ? "Head" : "Tail"; 
     } 
     String[] heads = head.split(flips); 
     String[] tails = tail.split(flips); 
     //Display 
     System.out.println("Times head was flipped:" + heads.length); 
     System.out.println("Times tail was flipped:" + tails.length); 
    } 
} 

該程序似乎正在工作,但它總是給我總是幾乎一對的頭和尾,總數超過1000,至少1或更多。 請問,有人有這個解決方案嗎?我錯在哪裏? 感謝

回答

1

硬幣有兩面,所以我真的不明白你爲什麼會要求隨機發生器產生一個介於0和100之間的數字(不包括)。在0和2之間(排他)會更合乎邏輯。

此外,你被要求數。附加字符串,然後分裂以獲得最終值是相當複雜和低效的方法。你應該使用一個整數來代替。每次從隨機獲得1時,增加一個計數器。最後,你有1次返回的次數,0的次數是1000,這個數字。

Random r = new Random(); 
    int heads = 0; 
    for (int i = 0; i < 1000; i++) { 
     int side = random.nextInt(2); 
     if (side == 1) { 
      heads++; 
     } 
    } 
    System.out.println("Times head was flipped:" + heads); 
    System.out.println("Times tail was flipped:" + (1000 - heads)); 

它甚至可以被簡化爲follwoing(雖然這簡化使得代碼比特更難理解):

Random r = new Random(); 
    int heads = 0; 
    for (int i = 0; i < 1000; i++) { 
     heads += random.nextInt(2); 
    } 
    System.out.println("Times head was flipped:" + heads); 
    System.out.println("Times tail was flipped:" + (1000 - heads)); 
2

,而不是一個字符串追加的結果,然後分割字符串和計數「頭」的發生/「尾巴」,你可以只跟蹤在不同的變量計數:

int headCount = 0; 
int tailCount = 0; 

for (int i = 0; i < 1000; i++) { 
    if(r.nextInt(100) %2 == 0) 
    { 
     headCount++; 
    } 
    else 
    { 
     tailCount ++; 
    } 

    System.out.println("Times head was flipped:" + headsCount); 
    System.out.println("Times tail was flipped:" + tailCount); 

}