[英]Is there a better way to calculate odds?
我当时正在编写一个模拟彩票游戏的程序,称为Club Keno,我想匹配他们对Kicker的赔率。 因此,我要做的是从1到10046之间选择一个随机数,然后根据该数字返回踢球值。 如果随机数为1000,则返回的踢脚值为4。我想知道是否存在更好的方法。 而且我知道这加起来并不完全是100%,但是那是我可以在网上找到的几率。 他们加起来达到100.45%
public static int Kicker()
{
var rnd = new Random();
int num = rnd.Next(1, 10046);
if (num < 125) //1.25 percent chance
return 10;
if (num < 495) //3.7 percent chance
return 5;
if (num < 1120)//6.25 percent chance
return 4;
if (num < 1745)//6.25 percent chance
return 3;
if (num < 5745)//40 percent chance
return 2;
return 1; // 43 percent chance
}
如何对Random类使用扩展方法:
static T Pick<T>(this Random random, Dictionary<T, double> elementToProbability)
{
var totalProbability = elementToProbability.Values.Sum();
var randomValue = random.NextDouble() * totalProbability;
foreach (var keyValuePair in elementToProbability)
{
if (randomValue < keyValuePair.Value)
return keyValuePair.Key;
randomValue -= keyValuePair.Value;
}
return default(T);
}
然后像这样使用它:
Random rnd = new Random();
int num = rnd.Pick(new Dictionary<int, double>
{
{ 10, 1.25 },
{ 5, 3.7 },
{ 4, 6.25 },
{ 3, 6.25 },
{ 2, 40 },
{ 1, 43 }
});
请注意,“概率”不必加起来最多为1或100或任何其他东西。
我查看了club-keno上的页面,查看那里所述的几率,如果您想实现一个准确的实施方案,那么这是我的发现和建议。
首先,陈述的几率有些不准确,因为如前所述,它们未将所有可能结果的概率加起来为1.0。 但是,最底下的说法是“总赔率:1.74中的1”表示未得到1的赔率。事实证明,这是数字2到10的单独赔率的相当准确的总和。 ,如果我们认为是正确的,那么在2.35081中获得1的几率实际上是1。
因此,我计算出要在代码中(几乎)准确地表示它们,那么我们需要表示以下100,000中的几率
因此,代码将类似于:
var rnd = new Random();
:
public static int Kicker()
{
// get integer number in the range 0-99999
int num = rnd.Next(0, 100000);
// check the ranges
if (num < 42546) return 1; // checking for 0 to 42,545
if (num < 82546) return 2; // 42,546 to 82,545
if (num < 88796) return 3; // 82,546 to 88,795
if (num < 95046) return 4; // 88,796 to 95,045
if (num < 98750) return 5; // 95,046 to 98,749
return 10; // 98,750 to 99,999
}
我们当然相信随机数发生器的概率分布在整个数字范围内是平坦的。 如果您不确定,则可以在一定程度上缓解这种情况,例如,对随机数使用更大的范围,例如将大小设置为100倍,然后在应用测试之前对结果取模100000:
int num = rnd( 0, 10000000 ) % 100000 ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.