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

时间:2017-10-12 15:13:27

标签: c#

我正在编写一个模拟名为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
}

2 个答案:

答案 0 :(得分:1)

如何使用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 }
});

请注意&#34;概率&#34;不要加上1或100或特别是任何东西。

答案 1 :(得分:0)

我查看了club-keno处的页面,看看那里所说的几率,如果你想要准确的实施,那么这是我的发现和建议。

首先,所述的可能性有些不准确,因为如前所述,它们对所有可能结果的概率不会达到1.0。然而,关于底线的声明&#34;整体赔率:1.74&#34;意味着:没有得到的可能性1.事实证明,对于数字2到10所说的单独赔率是一个相当准确的总和。因此,如果我们认为这是正确的,那么得到1实际上是2.35081中的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 ;