基于百分比的概率

15

我有这段代码片段:

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次检查不足以保证准确性?


是的,如果rand提供正态分布的随机值,则是这样。 - Vlad
2
@Vlad 我想你是指“均匀分布”。正态分布是高斯分布。 - clcto
你说得对,我想表达的是另一件事,写错了。谢谢。 - Vlad
3
如果你掷骰子6次,如果你得到了其中某个数字的2或3个而不是每个数字只有1个,你会认为这是“非常不准确”的吗? - AwokeKnowing
1
变量total遵循p=0.25的二项分布。因此,100次试验中total的标准差为sqrt(25)=5。使用正态近似,你只能期望约66%的测试在20<=total<=30的区间内,这意味着你计算出的p仅在66%的时间内介于.2和.3之间。如果你增加到1000,同样66%的区间是.235 <= total <= .265。对于10000,它是.245 <= total <= .255。 - Ben Allison
显示剩余2条评论
3个回答

16

这非常容易自己检查:

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

结论:是的,没错。


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

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

谢谢,但我已经更新了帖子,并添加了一个执行类似检查的代码。问题在于,如果它检查100次,结果可能从0.15到0.3的任何位置,但是当我检查10000次时,在我编写的代码中更准确。为什么会这样?为什么100次检查不够? - BlueRay101
12
如果你抛一枚硬币两次,结果都相同,这是否意味着这枚硬币坏了? - Rotem
@Rotem 我认为你需要一个足够的样本量。例如,我不认为你可以使用25个样本来确定25%的概率是否正确工作。 - The Muffin Man
没有25个样本,而是1000万个。 - Rotem

1

没问题,那样做应该很好。如果只是想要25%,可以随机生成介于1到4之间的数字。

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

内部的随机数将在0和1之间,因此使用4或1000并没有任何区别。添加参数只是将其投射到所需范围。


我知道,但有时候我不能只使用分数(例如像65%或55%这样的百分比),所以我计划将其用于其他百分比。非常感谢您的帮助。 - BlueRay101

1
对于大多数情况,我会说是的。但是,请记住,大多数随机化算法使用伪随机生成器,因此在某种程度上,您受制于该特定生成器的离奇性。我同意@AwokeKnowing的看法,您也可以只随机选择1到4之间的数字并获得相同的结果。我认为.Net随机化算法应该足够满足大多数情况。有关更多信息,请参见:

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


我给这个投票点了个踩,因为他看到的结果与样本大小有关,与生成器的特殊性无关。编辑:显然我没有足够的声望来点踩。把这个当作我的踩吧。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接