首页 > 解决方案 > 使用 C# 证明机会

问题描述

我在数学上不是很强,我试图证明 100 分之一的机会意味着平均而言,你有可能在 100 次尝试中赢得 1 个项目。

我正在尝试使用 100 万次运行来证明这一点,平均应该在 100 左右,我相信如果我进行了 100 万次运行。

但是,我得到平均值的方式是不正确的。

Random random = new Random();

// Lets assume droprate is 1 to 100
var dropRate = 100;

// Lets set tries to 1 million
var tries = 1000000;

List<int> wins = new List<int>();

// + 1 at end because this functions counts from 0 to 99
var prize = random.Next(0, dropRate) + 1;

// lets do 1 million runs
for (var i = 1; i <= tries; i++)
{
    // Lets create a random number 1 to 100
    var randomNumber = random.Next(0, dropRate) + 1;

    // Lets compare this random number with prize to see if it's equal.
    if (randomNumber == prize)
    {
        // Lets add the number of the current run to the list so we can later check average
        wins.Add(i);
    }
}

var wonRewardOnAverageRuns = wins.Average();

// Lets see what the average is of all wins
Console.WriteLine($"You won the prize in average of {wins.Average()} runs.");

标签: c#

解决方案


100 分之一的获胜机会意味着如果您做了 100 万次某事,您预计会赢得大约 10,000 次。下面的代码演示了这一点:

static void Main(string[] args)
{
    var sequence = RandomSequence(1_000_000, 100);
    var groups = sequence.GroupBy(i => i).OrderBy(group => group.Key);

    foreach(var group in groups)
    {
        Console.WriteLine("{0} => {1}", group.Key, group.Count());
    }
}

static IEnumerable<int> RandomSequence(int numberofItems, int upperBound)
{
    var random = new Random();

    for(int i = 0; i < numberofItems; i++)
    {
        var value = random.Next(upperBound);
        yield return value;
    }
}

如果你运行它并查看输出,你会发现每个数字都被选中了大约 10,000 次。有时它更多,有时它更少。可变性取决于我们所做工作的随机性和随机数生成器的质量。


推荐阅读