我有这段代码:
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次检查不够准确?
答案 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)
但请注意,25%的几率并不意味着在100次尝试中,他将赢得25次。这只意味着每次他有25%的获胜机会。从理论上讲,他每次都能获胜。 (但这不会发生,尤其是使用伪随机生成器)。
在内部,随机数将介于0和1之间,因此只要随机使用4为1000就可以了。添加参数只是将其投影到您想要的范围。
答案 2 :(得分:1)
对于大多数情况,我会说是的。但是,您必须记住,大多数随机化算法都使用伪随机生成器,因此在某种程度上,您将受到该特定生成器的特性的影响。我同意@AwokeKnowing你也可以在1到4之间做一个随机数,得到相同的结果。我假设.Net随机化算法应该足以满足大多数情况。有关详细信息,请参阅: