2010-09-10 278 views
5

我試圖從例如4個數字。我需要比較這兩種算法的可能性。隨機數字的概率

1#

   int a = random.Next(0, 4); 

       if (a = 0) 
        statement1 
       if (a = 1) 
        statement2 
       if (a = 2) 
        statement3 
       if (a = 3) 
        statement4 

2#

   int a = random.Next(0, 1000) 

       if (a < 250) 
        statement1 
       if (a >= 250 && a < 500) 
        statement2 
       if (a >= 500 && a < 750) 
        statement3 
       if (a >= 750) 
        statement4 

我說得對,如果我認爲這是一樣的嗎?第一個代碼中statement1的概率是1/4,第二個代碼中它的概率是250/1000,所以它也是1/4。但是有人告訴我,當我使用更大範圍的隨機數時,比如代碼2#在統計上更準確。我已經制作了多次重複這些代碼的項目,但我不確定它是否顯示了一些結果。

+1

側面說明,你可能想else子句添加到您的IFS。一旦您取得成功,無需評估全部4個選項。 – 2010-09-10 17:59:52

回答

3

它們完全相同(除了第一個由於在if-子句中使用=而不是==而不能編譯的事實)。

爲了證明這一點,請看執行Random.Next(int, int)。與你的價值觀,Random.Next(0, 4)

(int) (Random.Sample() * 4) 

Random.Next(0, 1000)

(int) (Random.Sample() * 1000) 

,其中Random.Sample()是返回一個隨機雙的私有方法。

現在應該很容易看出,Random.Next(0, 4)返回0 正是Random.Next(0, 1000)將返回0和250

+0

它可以編譯,但它肯定不會做你想要的。 – Live 2010-09-10 17:50:31

+2

@Live,在c#中不是這樣。它不會編譯,並會產生編譯器錯誤:「不能隱式地將類型'int'轉換爲'bool'」 – 2010-09-10 17:55:30

+0

偉大的證明方法。 – 2010-09-10 18:03:11

2

僞隨機數應該均勻分佈,無論範圍是什麼之間的一個數。如果在第二個例子中,如果您只選擇最後4位(a & 3),您將得到相同的分配,就像您選擇(a>>2) & 3中的下4個一樣。即在第二個使用範圍的例子中,你在算法上做了什麼,是丟棄了很多隨機生成器給你的信息。你沒有更多的「隨機性」和更大的範圍。說到這一點,僞隨機生成器確實有它們的特質,但是除非你對此嚴肅認真,否則不值得擔心!

0

的分佈是均勻的,並很容易驗證:

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var random = new Random(); 
     const int iterations = 10000000; 

     var hits1 = 1.0 * Enumerable.Range(1, iterations) 
            .Select(i => random.Next(0, 4)) 
            .Where(i => i == 0).Count(); 
     Console.WriteLine(hits1/iterations); 

     var hits2 = 1.0 * Enumerable.Range(1, iterations) 
            .Select(i => random.Next(0, 1000)) 
            .Where(i => i < 250) 
            .Count(); 
     Console.WriteLine(hits2/iterations); 
    } 
} 
-1

我的測試如下

缺貨的10K環路2個測試用範圍1-4和一系列1-1000,繼承人的運行結果

1-4

1 > 2484 times 
    2 > 2519 times 
    3 > 2511 times 
    4 > 2487 times 

0 - 1000

1 - 250 > 2421 times 
    250 - 500 > 2531 times 
    500 - 750 > 2529 times 
    750 - 1000 > 2490 times 

我的結論是,他們沒有什麼區別什麼那麼,你必須進入矩陣的等等有過隨機數生成等一些控制。

注:我的測試是用PHP完成的,源代碼如下。


<?php 

$first = array(1=>0,2=>0,3=>0,4=>0); 
$second = array('0 - 250' => 0, '250 - 500' => 0, '500 - 750' => 0,'750 - 1000' => 0); 

for($i=0;$i<=10000;$i++) //10K 
{ 
    //First 
    $f_number = rand(1,4); 
    switch($f_number) 
    { 
     case 1: $first[$f_number]++; break; 
     case 2: $first[$f_number]++; break; 
     case 3: $first[$f_number]++; break; 
     case 4: $first[$f_number]++; break; 
    } 

    //Second 
    $s_number = rand(1,1000); 
    if($s_number < 250) $second['0 - 250']++; 
    if($s_number > 250 && $s_number < 500) $second['250 - 500']++; 
    if($s_number > 500 && $s_number < 750) $second['500 - 750']++; 
    if($s_number > 750) $second['750 - 1000']++; 
} 

var_dump($first,$second); 
?> 
+0

-1假設PHP的隨機數實現的實現與C#使用的實現完全相同, – 2010-09-10 18:24:33