2017-02-11 75 views
0

我有一個關於在C#中隨機工作的問題。說我要打電話,如果變量i == 0,我有以下代碼一些功能:運行隨機,C#

Random rnd = new Random(); 
int i = rnd.Next(5); 
if (i == 0){ 
    myFunction(); 
} 

所以,我會打電話每程序的啓動5 myFunction的()一次。如果我有另一個代碼:

Random rnd = new Random(); 
for (int j = 0; j < 10; j++){ 
    int i = rnd.Next(50); 
    if (i == 0){ 
     myFunction(); 
    } 
} 

我會在最後得到相同的結果嗎? (調用的MyFunction()每5個啓動程序的一個時間)

+1

我投票結束這個問題作爲題外話,因爲這不是一個真正的編程問題,這是一個數學問題。 –

+0

是的,'myFunction()'平均每5次啓動一次。 – Serge

+0

如果您希望代碼在每五次啓動一次的程序中運行*,您必須執行一些操作,例如將計數存儲到註冊表中。 –

回答

3

如果你給它一個嘗試,在運行此幾個時間:

class Program 
{ 
    static int _caseOneCount = 0; 
    static int _caseTwoCount = 0; 

    static Random _rnd = new Random(); 

    static void Main(string[] args) 
    { 
     var max = 100000; 

     for (var i = 0 ; i < max ; i++) 
     { 
      CaseOne(); 
      CaseTwo(); 

      Console.WriteLine(_caseOneCount.ToString() + "/" + _caseTwoCount.ToString()); 
     } 
    } 

    static void CaseOne() 
    { 
     if (_rnd.Next(5) == 0) 
      _caseOneCount++; 
    } 

    static void CaseTwo() 
    { 
     for (var i = 0 ; i < 10 ; i++) 
      if (_rnd.Next(50) == 0) 
       _caseTwoCount++; 
    } 
} 

你會看到的結果是幾乎相當,並接近20%,符合市場預期。

編輯:現在,如果你運行CaseOne和CaseTwo 只有一次,你可以有:

  • CaseOne:只有0或1,
  • CaseTwo:從0到10

編輯2:關注@ Jean-ClaudeColette的評論。第二種情況對應於二項分佈(https://en.wikipedia.org/wiki/Binomial_distribution)。

因此,作爲結果,該概率爲具有:

  • 0呼叫是81.7%
  • 1呼叫16.7%
  • 2呼叫是1.5%
  • 更是100%減去上述這大約是0.086%

但是平均值保持20%。

這意味着,與第一種情況相比,僅應用一次第二種情況會導致不同的結果。

隨機

並且其細節在文檔中: https://msdn.microsoft.com/fr-fr/library/system.random(v=vs.110).aspx

並且在此所描述的內算法的描述(Knuth的減色隨機發生器)(用C#實現這不是。淨實施,但看看它是如何工作的): https://rosettacode.org/wiki/Subtractive_generator

+0

你的代碼示例並不是P(rand(5)== 0)和P(rand(50)== 0)之間的公平比較。相反,它比較P(rand(5)== 0)和P(rand(50)== 0)* 10,這就是爲什麼它們都是20%。 – sidecus

+0

@Helen分佈是二項式的,但參數是不同的。您正在尋找在n次試驗中獲得MyFunction k次調用的概率。調用MyFunction的概率等於p,獲得MyFunction的k個調用的概率爲C_n^k * p^k *(1-p)^ {n-k}。我們必須比較固定的結果,得到的p = 1/5和p = 1/50以及不同數量的試驗n和10 * n –

+0

@BobbyAndJoe,我將問題解釋爲比較P(rand(5)= = 0)和P(rand(50)== 0)* 10 – lemon

0

其實你既上述聲明是錯誤的。

爲了您的第一個循環,也不能保證你的函數將得到每5所發佈調用一次 - 但你的功能,如果你運行它足夠的時間的概率得到了所謂的1/5。

你的第二個代碼示例中,概率爲1/50來代替。而你的外(j)循環只是控制你用你的語言來運行多少「發射」 - 它不會改變概率。

+0

我知道有沒有保證,我在談論的概率。那麼1/5的概率等於10 1/50概率呢? :) – Helen

+1

您投資10美元並獲得1美元回報,您的利潤率爲10%。現在你投資5美元10美元,你的利潤率是50%嗎? – sidecus