繁体   English   中英

您想通过单一(简单)选项参与 49 次机会游戏中的 6 次,并且想知道获胜的机会

[英]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: Codecogs 渲染的 PNG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM