我正在编写一个模拟名为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
}
答案 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的赔率
所以代码就像:
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 ;