[英]You want to participate in the 6 out of 49 game of chance with a single (simple) option and you want to know your chances of winning
我再次更新了代码。 看来现在效果更好了。 但我仍然有一个问题。 我必须上传它的网站说当n = 49 k = 6 j = II时它不起作用。 我还包括了每个 Combinator 的结果,看看我是否在某个地方搞砸了,但它计算正确。 我在纸上计算它,我得到相同的结果:
a = 6
b = 44
c = 13983816
final result = 0.0000188790
The site says the final result should be 0.0000184499
您想通过单一(简单)选项参与 49 场机会游戏中的 6 场,并且想知道获胜的机会:
第 I 类(6 个号码) 第 II 类(5 个号码) 第 III 类(4 个号码) 编写一个控制台应用程序,计算您中奖的机会。 推广解决方案以适用于总球数、抽出球数和类别的任意组合。
该应用程序将球的总数、抽出的球数和类别作为输入,然后打印出精确到小数点后 10 位的获胜赔率(如果只玩一种变体)。
例子:
对于条目数据:
40
5
II
控制台将显示:
0.0002659542
这是公式:
kCj * (n-j)C(k-j) / nCk
这应该转化为
k!/(j!*(k-j)!) * (n-j)!/((k-j)!*(n-k)!) / n!/(k!*(n-k)!)
这是我的代码:
static void Main(string[] args)
{
string n1 = Console.ReadLine();
decimal n = Convert.ToDecimal(n1);
string k1 = Console.ReadLine();
decimal k = Convert.ToDecimal(k1);
string tempJ = Console.ReadLine();
decimal j = 0;
decimal a, b, c, result;
if (tempJ == "I")
{
j = 6;
}
if (tempJ == "II")
{
j = 5;
}
if (tempJ == "III")
{
j = 4;
}
a = nCk(n, k, j);
Console.WriteLine(a.ToString("F10"));
b = nCk(n, k - j, n - j);
Console.WriteLine(b.ToString("F10"));
c = nCk(j, n, k);
Console.WriteLine(c.ToString("F10"));
result = a * b / c;
Console.WriteLine(result.ToString("F10"));
}
static decimal nCk(decimal n, decimal k, decimal j)
{
if (k == j)
return 1;
if (k - j == 0)
return 1;
decimal temp1;
if (k < j)
{
temp1 = k;
k = j;
j = temp1;
}
decimal kj = k - j;
if (j < kj)
{
temp1 = j;
j = kj;
kj = temp1;
}
decimal result1 = 1;
for (decimal i = j + 1; i <= k; i++)
{
result1 *= i;
}
decimal result2 = 1;
for (decimal i = 1; i <= kj; i++)
{
result2 *= i;
}
return result1 / result2;
}
你的公式不正确。
从n 个可能性中选出的k个数字中,准确地猜出 j个正确数字的概率为:
在您的公式中,第二个二项式系数中的n - k已被替换为n - j ,导致多算。 为清楚起见,分数的分子是从k个中奖号码中抽取j个数字并且从n - k个未中奖号码中抽取k - j个数字的子集的数量。
通过这个微小的更改,您将获得预期的概率计算。
我只觉得使用codecogs有点糟糕。 恕我直言,使用 MathJax 进行客户端渲染会好很多,但这不会发生。 如果 Codecogs 消失或过载,这里是 PNG:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.