c# - 使用 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.");
解决方案
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 次。有时它更多,有时它更少。可变性取决于我们所做工作的随机性和随机数生成器的质量。
推荐阅读
- java - 为什么杰克逊的二传手只是反序列化?
- python - Python 的 yfinance 和 yahoo_fin 最近是否停止工作?
- excel - 使用 VBA 自动填充具有不同值的列
- .net-core - 我的单例类 .NET Core 中的依赖注入
- php - Magento 2 Block 模板在本地工作,不在服务器上
- c# - 通过.net上的字符串数组elasticsearch查询
- c# - (已关闭)导航到 C# Windows 窗体中的其他用户控件时不重置控件文本/值
- r - 可以将 ggplot2 geom_segment 大小指定为轴大小的比例吗?
- templates - Azure 资源管理器模板 - API 预览版
- assembly - 如何优化这个程序的算法(用asm编写)