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