2017-02-11 86 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