c#中如何计算彩票的中奖几率?

Posted

技术标签:

【中文标题】c#中如何计算彩票的中奖几率?【英文标题】:How to calculate the winning chance of the lottery in c#? 【发布时间】:2021-05-06 14:27:47 【问题描述】:
using System;

namespace FirstApplication

    class Program
    
        public static void Main()
        
            int n = Convert.ToInt32(Console.ReadLine());
            int k = Convert.ToInt32(Console.ReadLine());
            string category = Console.ReadLine();
            double total = 0;

                switch (category)
                
                    case "I":
                        total = bc(k, 6) * bc(n - k, k - 6) / bc(n, k);
                        Console.WriteLine("0:F10", total);
                        return;
                    case "II":
                        total = bc(k, 4) * bc(n - k, k - 4) / bc(n, k);
                        Console.WriteLine("0:F10", total);
                        return;
                    case "III":
                        total = bc(k, 2) * bc(n - k, k - 2) / bc(n, k);
                        Console.WriteLine("0:F10", total);
                        return;
                
            Console.Read();

        
        private static double bc(decimal n, decimal k)
        
            if (k == 0 || k == n)
                return 1;
            return bc(n - 1, k - 1) + bc(n - 1, k);
        
    




我的代码有问题。

练习如下:

您参加 6/49 彩票只有一个中奖变体(简单),并且您想知道您的中奖几率:

-I 类(6 个数字)

-在 II 类(5 个数字)

-在类别 III(4 个数字)

编写一个控制台应用程序,输入总球数、提取球数和类别,然后如果您使用一种简单的变体,则以小数点后 10 位的精度打印获胜几率。

例如,如果我输入:

49

6

结果还可以,但是当我输入时:

45

15

III

我没有得到任何结果。

任何建议我的代码有什么问题?

【问题讨论】:

你一步步调试问题了吗?我敢打赌,您会比这里的任何人都更快地发现问题,因为您最清楚自己的应用应该做什么以及它应该做什么 可以,我调试了,但还是查不出来是什么问题。 那么在调试时究竟会发生什么? bc 为案例 "III" 返回什么?在bc 中设置一个断点,看看它是否被命中。如果它逐行通过您的代码来查看它的行为与您期望的不同之处。我们不能说你所期望的,只有你可以。 想一想:如果您对kn 的输入都是奇数,那么if (k == 0 || k == n) 会变成真的吗? 【参考方案1】:

我认为您的代码没有任何问题。它只运行了很长时间,因为您一次又一次地使用相同的值调用bc。我添加了一个字典来存储和查找已经计算的值:

private static Dictionary<(int N, int K),double> knownValues = new Dictionary<(int N, int K),double>();
private static double bc(int n, int k)

    var key = (n,k);
    if (!knownValues.ContainsKey(key))
    
       if (k == 0 || k == n)
       
           knownValues.Add(key, 1);
       
       else 
       
           knownvalues.Add(key, bc(n - 1, k - 1) + bc(n - 1, k));
       
    
    return knownValues[key];

它会在

【讨论】:

编译器知道并试图告诉你。如果您使用的是旧版本的 C#,它可能不知道命名 tupes (int n, int k)

以上是关于c#中如何计算彩票的中奖几率?的主要内容,如果未能解决你的问题,请参考以下文章

彩票双色球中奖的几率是多少?谁算过?

双色球中5个红号的几率是多少?

彩票中奖机会练习

中奖的概率是1%,则抽奖100次中奖的几率是多少

彩票算概率问题

爬取彩票中奖信息