2012-05-05 16 views
2

可能重複:
Expand a random range from 1–5 to 1–7使用rand5(),生成rand7()(以相同的概率)

我已經看到了這個問題在這裏:Link

作者提供的解決方案似乎沒有產生相同的概率。

例如,函數的10k次調用中的數字4返回了1-2次(當其他數字(如2)每次返回約2k次時)。

也許我理解錯了,還是我寫的算法不對,但在這裏:

static int rand5() 
    { 
     return new Random().Next(1, 6); 
    } 
    static int rand7() 
    { 
     while (true) 
     { 
      int num = 5 * (rand5() - 1) + rand5(); 
      if (num < 22) return ((num % 7) + 1); 
     } 
    } 
    static void Main(string[] args) 
    { 
     int limit = 10000; 
     int[] scores = new int[7]; 
     for (int i = 0; i < limit; i++) 
     { 
      scores[rand7() - 1]++; 
     } 
     foreach (int n in scores) 
     { 
      Console.Write(n + " "); 
     } 
     Console.WriteLine(); 
    } 

在此先感謝。

回答

2

您不會在Rand5中生成隨機數字。

做這樣的:

static Random rand = new Random() 
static int rand5() 
{ 
    return rand.Next(1, 6); 
} 
+0

這工作,就是我之間是如何規定的rand5(),和你有什麼區別? – Novak

+3

Guy,不同之處在於他一直使用同一個rand對象。其實還有一個着名的例子,那就是那些注意到計算機編程中出現類似故障的人曾多次贏得過樂透。問題在於,爲了製作隨機數字,計算機需要建立一個「種子」。每當你做「新」時,你重新創建它實際上阻止了它的隨機性,因爲它模仿了計算機利用這個種子值的創建。 –

+1

隨機使用一個固定的隨機數序列。當您執行「新隨機」時,您可以根據當前時間選擇序列中的起始位置。由於您每次都選擇相同的起始位置並且返回相同的號碼,所以您每次都調用「新隨機數」。我的代碼選擇一次起點,然後每次從序列中返回下一個數字。 – adrianm