基于百分比的概率
我有这段代码:
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随机化算法应该足以满足大多数情况。 有关详情,请参阅:
是的,这应该工作正常。 就像> = 75也可以。 如果你只想要25%,你可以继续做一个1到4之间的随机数。
但请注意,25%的几率并不意味着在100次尝试中,他将赢得25次。 这只意味着每次他有25%的获胜机会。 从理论上讲,他每次都有可能获胜。 (但这不会发生,特别是使用伪随机生成器)。
在内部,随机数将介于0和1之间,因此只要随机使用4作为1000就可以了。 添加参数只是将其投影到您想要的范围。