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

C# 有没有更好的方法来计算赔率?,c#,C#,我在写一个程序,模拟彩票游戏,名为俱乐部基诺,我想匹配他们对踢球者的赔率。所以我所做的是选择一个介于1和10046之间的随机数,然后根据这个数,返回kicker值。如果随机数是1000,我返回一个kicker值4。我想知道是否有更好的方法来做到这一点。我意识到这并不等于100%,但这是我在网上能找到的几率。加起来是100.45% public static int Kicker() { var rnd = new Random(); int num = rnd.Next(1, 1

我在写一个程序,模拟彩票游戏,名为俱乐部基诺,我想匹配他们对踢球者的赔率。所以我所做的是选择一个介于1和10046之间的随机数,然后根据这个数,返回kicker值。如果随机数是1000,我返回一个kicker值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或任何特定值。

我已经查看了页面,以查看其中所述的概率,如果您希望得到准确的实现,那么下面是我的发现和建议

首先,所述的概率有些不准确,因为正如前面提到的,它们加起来并不是所有可能结果的1.0概率。然而,底线上的声明,即总赔率:1:1.74意味着:这是不获得1的赔率。事实证明,这是一个相当准确的数字2到10的单独赔率总和。因此,如果我们认为这是正确的,那么得到1的几率实际上是1/2.35081

因此,我计算出,为了在代码中几乎准确地表示它们,我们需要表示100000个概率中的以下概率

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
}

为什么是10046?为什么要使用int呢?您可以从Random生成一个double。另外,为什么在方法中实例化了随机变量?它应该是静态的、类级别的,而不是方法级别的。它位于一个名为Pick的类中,负责选择抽签号码、玩家号码、杰克号码、ez-Pick号码和踢球者。。。。。因为否则,如果您非常快速地调用此方法,您将始终生成相同的随机数,因为当前时间被用作随机数的种子。@Joseph Thompson使用线程。睡眠来克服相同的随机数种子是非常可怕的。老实说,只需使用并调整代码即可。使用字典而不是OP用来存储踢球者及其概率的自定义类。您可能需要5分钟的时间来了解如何实现它,因为我对扩展方法相当陌生,但现在我一直在尝试如何返回值。当我尝试返回random时,它说不能隐式地将type System.random转换为Int。嗯,当我尝试返回random时,你是什么意思?您希望使用它的方式如下:var rnd=new Random;int num=rnd.picknewdictionary{…};哦,好的,明白了。我没有给它赋值,我只是在使用它。谢谢工作很好!!!
int num = rnd( 0, 10000000 ) % 100000 ;