c#中如何计算彩票的中奖机率?
How to calculate the winning chance of the lottery in c#?
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
三
我没有得到任何结果。
有什么建议我的代码有什么问题吗?
我认为您的代码没有任何问题。它运行了很长时间,因为您一次又一次地使用相同的值调用 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];
}
它 returns 在 < 6 秒内为您的 45,15,III 输入值 0.0364626616。这是否正确,我不知道,但至少它终止了。也许你的老师想让你尝试一下并了解递归和计算时间。
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
三
我没有得到任何结果。
有什么建议我的代码有什么问题吗?
我认为您的代码没有任何问题。它运行了很长时间,因为您一次又一次地使用相同的值调用 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];
}
它 returns 在 < 6 秒内为您的 45,15,III 输入值 0.0364626616。这是否正确,我不知道,但至少它终止了。也许你的老师想让你尝试一下并了解递归和计算时间。