基于百分比的概率

时间:2013-12-06 17:53:22

标签: c# probability percentage

我有这段代码:

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次检查不够准确?

3 个答案:

答案 0 :(得分:10)

这很容易自己检查:

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);

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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