繁体   English   中英

有没有更好的方法来计算赔率?

[英]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中的几率

  • 1:42546
  • 2:40000
  • 3:6250
  • 4:6250
  • 5:3704
  • 10:1250

因此,代码将类似于:

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.

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