2016-04-29 82 views
0

我想要一個隨機數生成器來模擬擲硬幣,並在這裏就是我所做的擲硬幣使用隨機數並不恰好出現隨機

public class CoinToss 
{ 
    public static void main(String args[]) 
    { 
     int num=(int)(1000*Math.random()); 
     if(num<500) 
      System.out.println("H"); 
     else 
      System.out.println("T"); 
    } 
} 

結果進行勸阻,因爲我在20拿到了16頭和4尾運行。 那不是出現是隨機的。它的可能性,但如果程序是正確的我想要一個普遍的意見?我是否缺少數學的東西?

+0

嘗試運行它更多的時間。你可能會得到更好的結果。 – Hackerdarshi

+1

20個樣本在數學上是無意義的,托盤再次具有更大的樣本(至少10k) – Preuk

+1

是的,@Preuk是對的。我只是用max_int循環遍歷你的例子,結果如下:H:1073754033,T:1073729614 – Christoph

回答

0

修改了你的代碼,它看起來足夠隨機。

代碼:

int h = 0; 
    int t = 0; 
    for (int i = 0; i < 1000; i++) { 
     int num = (int) (1000 * Math.random()); 
     if (num < 500) { 
      h++; 

     } else { 
      t++; 

     } 
    } 
    System.out.println("T:" + t); 
    System.out.println("H:" + h); 

輸出:

T:506 
H:494 

我想這是事物與隨機性^^

0

你的代碼似乎是正確的,雖然你可以實現很容易:

Random r = new Random(); 
int num = r.nextInt(2); 
if (num == 0) 
    System.out.println("H"); 
else 
    System.out.println("T"); 

Random#nextInt(int i)返回0i-1

+1

你的代碼似乎是正確的,雖然你可以更容易地實現它:'r.nextBoolean();';) – Kayaman

0

你爲了得到每一個同等數量的需要的方式更多的輸入之間的隨機整數。對於這樣少量的輸出,有時你會使它們在數字方面接近,有時候一方會「顯示」多於另一方。實際上,有4尾巴和16首長的概率是0.462%,這是有點「現實」的發生......嘗試更多地使用它運行更多數量的運行並查看它的行爲。

而且順便說一句想一想輸入:

6 6 6 6 6 6 6 6 6 6 

似乎並不隨機的,對不對?但它在某個點存在於數字π的小數點,所以它是隨機序列的一部分。它只是一個系列大小的問題,所以當你使用隨機數字時,你必須這樣思考。多想想隨機生成器而不是結果。你使用正確的函數,因爲它基於System.nanoTime(),所以生成器是正確的,但你的結果是很小。

1

20次運行的樣本量不夠大,無法評估它的隨機性。你可以這樣想:如果你做了4次跑步並拿到4次頭,你會想:「哇,那根本不是隨機的。」但事實上,如果你拿了4個硬幣,並翻轉了16次,你至少會得到4個硬幣。所以,如果你做了少量的跑步,並且你得到的結果在頭部和尾部之間並不是等分的,那並不意味着它不是隨機的。或者看看它:如果你寫了一些代碼,只是打印「頭」,然後「尾巴」,然後「頭」等,你會得到正好半頭半尾巴。但那根本不是隨機的!這只是一種重複模式。

因此,隨機結果在短期內看起來不均勻的情況下,故事的寓意不會感到驚訝。嘗試重新編寫代碼,以便計算多少頭和多少尾,並讓它翻轉大約一百萬左右,並查看各自是否得不到約500,000條。它應該多一點或少一點,因爲隨機不會給你確切的,但它應該更接近。

0

僞隨機數發生器(PRNG),也稱爲確定性隨機位發生器(DRBG),是一種用於生成其屬性近似於隨機數序列屬性的數字序列的算法。

的PRNG生成的序列不是真正隨機的,因爲它完全由相對小的組初始值決定的,稱爲PRNG的種子

雖然更接近真正隨機的,可以產生的序列

任何考慮產生隨機數字的算術方法的人當然都處於犯罪狀態。 John von Neumann