基于百分比的概率

我有这段代码:

Random rand = new Random(); int chance = rand.Next(1, 101); if (chance <= 25) // probability of 25% { Console.WriteLine("You win"); } else { Console.WriteLine("You lose"); } 

我的问题是,它真的计算出25%的获胜概率吗? 在这里赢球的机会是25%?

编辑:

我刚刚写了这个:

  double total = 0; double prob = 0; Random rnd = new Random(); for (int i = 0; i < 100; i++) { double chance = rnd.Next(1, 101); if (chance <= 25) prob++; total++; } Console.WriteLine(prob / total); Console.ReadKey(); 

这是非常不准确的。 它从大约0.15到0.3。

但是当我做更多的检查(从(i <100)变为(i <10000))时,它会更准确。

为什么是这样? 为什么100次检查不够准确?

这很容易检查自己:

 Random rand = new Random(); int yes = 0; const int iterations = 10000000; for (int i = 0; i < iterations; i++) { if (rand.Next(1, 101) <= 25) { yes++; } } Console.WriteLine((float)yes/iterations); 

结果:

 0.2497914 

结论:是的,是的。


编辑:只是为了好玩,LINQy版本:

 Random rand = new Random(); const int iterations = 10000000; int sum = Enumerable.Range(1, iterations) .Count(i => rand.Next(1, 101) <= 25); Console.WriteLine(sum / (float)iterations); 

对于大多数情况,我会说是的。 但是,您必须记住,大多数随机化算法都使用伪随机生成器,因此在某种程度上,您将受到该特定生成器的特性的影响。 我同意@AwokeKnowing你也可以在1到4之间做一个随机数,得到相同的结果。 我假设.Net随机化算法应该足以满足大多数情况。 有关详情,请参阅:

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

是的,这应该工作正常。 就像> = 75也可以。 如果你只想要25%,你可以继续做一个1到4之间的随机数。

但请注意,25%的几率并不意味着在100次尝试中,他将赢得25次。 这只意味着每次他有25%的获胜机会。 从理论上讲,他每次都有可能获胜。 (但这不会发生,特别是使用伪随机生成器)。

在内部,随机数将介于0和1之间,因此只要随机使用4作为1000就可以了。 添加参数只是将其投影到您想要的范围。