Dav*_*ita 2 .net c# math probability
我正在挠头2天,无法弄清楚我的代码有什么问题.可以说我有2个数组:
Array1[33]: 0..31 (it has 2 fives)
Array2[32]: 0..31 (it has one five)
Run Code Online (Sandbox Code Playgroud)
现在我想计算从第一个数组中随机选取5的概率和从第二个数组中随机选择5的概率.我用这个公式做到这一点:
(2M / 33) * (1M / 32)
Run Code Online (Sandbox Code Playgroud)
这是粗略的0.001894.现在,如果我运行周期足够长,比如1000,000,0我应该期望'5''5'大约上升18940次,但是当我运行测试时这不会发生.这是代码:
public class Program
{
private static List<int> numbers1 = new List<int>();
static Random random = new Random(Guid.NewGuid().GetHashCode());
private static List<int> numbers2 = new List<int>();
static void Main(string[] args)
{
for (int i = 0; i < 33; i++)
{
numbers1.Add(i);
numbers2.Add(i);
}
numbers1.Add(5);
while (true)
{
var counter = 0;
for (int i = 0; i < 10000000; i++)
{
var num1 = numbers1[random.Next(0, 33)];
var num2 = numbers2[random.Next(0, 32)];
if (num1 == 5 && num2 == 5) counter++;
}
Console.Write(counter + ": " + (decimal) counter / 10000000 + " - " + (2M / 33) * (1M / 32));
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
模式'5''5'出现在9300-9500次,当它应该出现两倍的次数.
所以我的问题是,我的数学/代码出了什么问题?
谢谢
编辑:
请注意,如果我在第一个数组中只留下五个,那么一切都按预期工作.
//numbers1.Add(5);
while (true)
{
var counter = 0;
for (int i = 0; i < 10000000; i++)
{
var num1 = numbers1[random.Next(0, 33)];
var num2 = numbers2[random.Next(0, 32)];
if (num1 == 5 && num2 == 5) counter++;
}
Console.Write(counter + ": " + (decimal) counter / 10000000 + " - " + (1M / 33) * (1M / 32));
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
此代码返回预期结果
解决方案非常简单:您向阵列添加了太多元素.
for (int i = 0; i < 33; i++)
{
numbers1.Add(i);
numbers2.Add(i);
}
Run Code Online (Sandbox Code Playgroud)
向数组添加33个元素而不是32 个元素.
Random.Next(a, b)在[a, b)(半开间隔)之间生成一个随机数.因此random.Next(0, 33)将生成0到32(含)之间的数字.您添加的附加5 numbers1将永远不会被检索,因为它位于索引33处.
如此简单,在创建数据时将33更改为32,它将起作用.
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |