2015-01-20 44 views
1

我在數組上有一個非常簡單的問題。我一直在看一些教程,並不明白爲什麼下面的代碼將頻率輸出作爲1 **的隨機組合。它從來沒有給出像5,67,541等數字,它總是給出像150,175,183等。我希望我明確自己。非常感謝!這個生成隨機數的程序爲什麼會持續產生數百個數字?

代碼:

Random rand = new Random(); 
    int freq[] = new int[7]; 

    for(int roll=1; roll<=1000; roll++){ 

     ++freq[1+rand.nextInt(6)]; 
    } 

    System.out.println("Face\tFrequency"); 

    for(int face=1; face<freq.length; face++){ 
      System.out.println(face + "\t" + freq[face]); 
    } 

樣本輸出:

Face  Frequency 

1  176 

2  171 

3  157 

4  159 

5  164 

6  173 
+0

這不是一個數組問題,因爲它是一個概率問題。它**可以給出小數字,這是不太可能的。 – 2015-01-20 23:35:54

+0

它與整數在0和5之間的隨機分佈(1-6)有關。從統計上看,如果隨機數發生器是真正隨機數的話,他們都可能發生同樣的情況,這就是爲什麼你看到的數字看起來像是「奇怪」的。例如看到一個6的'67'就表明6只在1000箇中滾動了67次,這不太可能。例如加權死亡可能產生看起來不正常分佈的數字,因爲滾動給定數字的概率與其他數字不同。 – 2015-01-20 23:36:21

回答

4

這實際上是一個比編程問題更重要的數學問題!

骰子擲骰有六種可能的結果,並且擲骰子的次數爲1000次。這意味着如果你想看到一個不是「一百和十」形式的數字,你需要查看200個或更多的一個數字或99個或更少的數字。您將看到每個數字的預期次數爲1000/6 = 166.7,因此要查看200個或更多的數字,您需要偏離真實值+33.3或-66.7。這可能發生;這只是不常見的。

我寫了一個程序,模擬這樣的滾動骰子,直到你得到這些類型的卷子之一,並計算你需要擲骰子的次數。在做完這1000次後,我發現平均來說,你需要擲出骰子53次,然後才能看到一個不在一百的數字。下面的代碼:

import java.util.*; 

public class DiceRolls { 
    /* The number of trials to run. */ 
    private static final int NUM_TRIALS = 1000; 

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

     int totalRuns = 0; 
     for (int i = 0; i < NUM_TRIALS; i++) { 
      totalRuns += runsUntilEvent(rand); 
     } 
     System.out.println(totalRuns/(double)NUM_TRIALS); 
    } 

    private static int runsUntilEvent(Random rand) { 
     /* Track how many tries we needed. */ 
     int numTries = 0; 
     while (true) { 
      numTries++; 

      /* Rather than indexing from 1 to 6, I'm indexing from 0 to 5. */ 
      int freq[] = new int[6];    
      for(int roll = 0; roll < 1000; roll++){ 
       ++freq[rand.nextInt(6)]; 
      } 

      /* See if this isn't in the hundreds. */ 
      for(int face = 0; face < freq.length; face++){     
       if (freq[face] >= 200 || freq[face] <= 99) { 
        return numTries; 
       } 
      } 
     } 
    } 
} 

所以回答你的問題是「你可能會看到它,但它不太可能,你不得不運行程序很多看到它。」

希望這有助於!

+0

哦,我知道了。所以它基本上給了我「輸出1000張特定面數的次數」的輸出。像面部1出現了176次,面部2出現了171次等。我認爲程序做了別的事情。從這個角度考慮,就像你所說的那樣,但某些特定的面孔出現在150以下和200以上並且不太可能出現在5次左右。哇,我好蠢:)謝謝你的幫助! – 2015-01-21 00:12:17

0

這是正常的。 5的頻率將是非常不尋常的,因爲這意味着該數字在1000之內只能滾動5次。您得到的數字大約是總數1000卷的1/6,因此六個數字中的每一個都會滾動大約一個六分之一的時間。

+0

非常感謝你的簡單解釋,真的幫了大忙! – 2015-01-21 00:13:27

0

由於循環1000次的事實,偏差很小。

如果只循環10次,但在循環中將數字增加100,則會出現更高的偏差。

0

輸出是在每個「骰子滾動」中找到數字的次數。至於你使用的是僞隨機數字生成,數字生成被認爲是「公平的」,因此你有一個「公平的擲骰子」,這意味着每個數字在每次出現時都有相同的機會。

因此,每個數字應該平均出現總數的1/6倍,這是您現在的結果。

如果增加總卷的數量,每個數字之間1/6的偏差會更大並且與卷的數量類似地增加。

0

我想你的原始問題是爲什麼你沒有得到低於100(低於10%)或高於500(高於50%)的低值。

簡短的回答,你沒有足夠的幸運。由於您創建隨機生成器的方式,您必須多運行程序以觀察這些值。

讓我們來計算,如果你運行你的程序只有一次超過50%的情況下出現的任何結果(頻率)的概率: 這可如果我們通過對滾輕易推算(如1000卷爲500對)

對於每一對,一些特定側的概率(例如6)是一個數的合格結果通過結果的總數除以:

合格的結果(對於側6發生在50米%的輥或多個):

16, 26, 36, 46, 56, 66, 
61, 62, 63, 64, 65 

分總的結果:6^2 = 36

所以11個合格結果通過除以總給予發生一側的概率50%的時間以上,這是11/36

現在我們需要這種情況發生(11/36)^(N/2)

Wolfram alpha給我們3.5 * 10^-258,這意味着您需要運行你的程序2.85 * 10^257次,期望(一次)500次或更多的一個特定的頻率。

除以6看到這個爲任何方。