C# 中彩票赔率
我还有一个关于彩票的问题。我必须提出这个问题:“你想参加49个游戏中的机会6,只有一个变体,你想知道你获胜的机会:第一类(6个数字)、第二类(5个数字)、第三类(4个数字).编写一个应用程序,该应用程序接收球的总数量、抽到的球的数量作为输入数据,然后以10位小数的精度打印获胜的机会(如果使用单个变量)。我的问题是:计算这个的公式是什么?我试图找到那个公式,但没有找到。一个例子是40,5和II(5个数字),结果是0.0002659542或45,15,第三类是0.0000001324。我需要提到我是一个初学者。我的代码正在运行,但从49开始只运行6次C# 中彩票赔率,c#,algorithm,math,probability,C#,Algorithm,Math,Probability,我还有一个关于彩票的问题。我必须提出这个问题:“你想参加49个游戏中的机会6,只有一个变体,你想知道你获胜的机会:第一类(6个数字)、第二类(5个数字)、第三类(4个数字).编写一个应用程序,该应用程序接收球的总数量、抽到的球的数量作为输入数据,然后以10位小数的精度打印获胜的机会(如果使用单个变量)。我的问题是:计算这个的公式是什么?我试图找到那个公式,但没有找到。一个例子是40,5和II(5个数字),结果是0.0002659542或45,15,第三类是0.0000001324。我需要提到我是
static void Main(string[] args)
{
int n = Convert.ToInt32(Console.ReadLine());
int k = Convert.ToInt32(Console.ReadLine());
string extract = Console.ReadLine();
int category1 = category(extract);
switch (category1)
{
case 6:
calculateTheOddsToWin(n, k, extract);
break;
case 5:
calculateTheOddsToWin(n, k, extract);
break;
case 4:
calculateTheOddsToWin(n, k, extract);
break;
}
}
static void calculateTheOddsToWin(int n , int k , string extract)
{
double comb = combination(n, k);
decimal solution =(decimal)( 1 / comb);
decimal round = Math.Round(solution,10);
Console.WriteLine(round);
}
static double combination(int n, int k)
{
double factN = factorialN(n);
double factK = factorialK(k);
double factNK = substractFactorialNK(n, k);
double combination = factN / (factNK * factK);
return combination;
}
static double factorialN(int n)
{
double factorialN = 1;
for(int i = 1; i <= n; i++)
{
factorialN *= i;
}
return factorialN;
}
static double factorialK( int k)
{
double factorialK = 1;
for (int i = 1; i <= k; i++)
{
factorialK *= i;
}
return factorialK;
}
static double substractFactorialNK(int n, int k)
{
double factorialNK = 1;
int substract = n - k;
for (int i = 1; i <= substract; i++)
{
factorialNK *= i;
}
return factorialNK;
}
static int category(string extract)
{
if(extract == "I")
{
return 6;
}else if(extract == "II")
{
return 5;
}else if(extract == "III")
{
return 4;
}
else
{
return -1;
}
}
static void Main(字符串[]args)
{
int n=Convert.ToInt32(Console.ReadLine());
int k=Convert.ToInt32(Console.ReadLine());
string extract=Console.ReadLine();
int category1=类别(摘录);
开关(类别1)
{
案例6:
计算oddstowin(n,k,extract);
打破
案例5:
计算oddstowin(n,k,extract);
打破
案例4:
计算oddstowin(n,k,extract);
打破
}
}
静态void计算ODDStowin(int n,int k,字符串提取)
{
双梳=组合(n,k);
十进制解=(十进制)(1/梳);
十进制四舍五入=数学四舍五入(解决方案,10);
控制台写入线(圆形);
}
静态双重组合(整数n,整数k)
{
双因子n=因子n(n);
双因子k=因子alk(k);
双因子NK=减因子NK(n,k);
双重组合=factN/(factNK*factK);
收益组合;
}
静态双因子n(int n)
{
双因子n=1;
对于(int i=1;i您需要计算三个数字:
T: The total number of combinations
W: The number of ways to draw the desired amount of winning numbers
L: The number of ways to draw the desired amount of losing numbers
Then, the answer is W * L / T
示例:40个数字,5个绘图,4个正确:
W = choose(5,4) = 5 (4 winners from 5 possibilities)
L = choose(35,1) = 35 (1 loser from 35 possibilities)
T = choose(40, 5) = 658008 (5 numbers from 40 possibilities)
5 * 35 / 658008 = 0.00265954
一般而言:
n = count of numbers
d = count of available winning numbers = draw size
k = count of winning numbers drawn (d, d-1, and d-2 for I, II, III).
W = choose(d, k) (k winners from d possibilities)
L = choose(n-d, d-k) (d-k losers from n-d possibilities)
T = choose(n, d) (d numbers from n possibilities)
仅供参考您的factorialN和factorialK是相同的,您可以用一个“factorial”替换它们 method@HansKest我做了这个改进。几天前,java也遇到了同样的问题,阶乘增长如此之快和高,以至于你无法将其存储在int
中int
通常介于-2147483648和2147483647之间。它对40,5不起作用,第二类我的结果是0.0000531474,我需要这个结果t 0.0002659542@jjj。我实际上放了一个双精度的,因为这样可以存储一个大的数字为什么W是(5和4),因为我是从键盘40,5和II类输入的(5个数字不是4)?为什么1在L?有40个号码,其中5个是赢家。在这个例子中,我们需要4个赢家号码和1个输家号码。4个赢家号码从5个可用的赢家号码中选择。1个输家号码从40-5=35个可用的输家号码中选择。这是非常有用的,但如果我有45、15和III,代码不起作用perly.45,15,III:选择(15,13)*选择(30,2)/choose(45,15)=0.000000132442