2017-10-12 93 views
0

我當時正在編寫一個模擬彩票遊戲的程序,叫做凱諾俱樂部,我想匹配他們對於踢球者的賠率。所以我所做的是從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 
} 
+7

爲什麼10046?爲什麼要使用int?你可以從Random生成一個double。另外,爲什麼你的隨機在該方法中實例化?它應該是靜態和類級別的,而不是方法級別。 – maccettura

+0

它在一個名爲Pick的類中,它負責挑選繪製數字,玩家數字,千斤頂數字,ez挑選數字和踢球者。 –

+2

....因爲否則如果您以非常快的速度調用此方法(因爲當前時間用作Random的種子),您將始終生成相同的「隨機」數字。 –

回答

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 } 
}); 

注意 「概率」不需要添加1或100或特別的東西。

+0

花了我一段時間想法實現這一點(因爲我在擴展方法相當新),但現在我卡住試圖找出如何返回一個值。當我嘗試返回隨機的,它說:「不能鍵入System.Random隱式轉換爲INT –

+0

嗯,你是什麼意思。‘當我嘗試返回隨機’你想用它是如下的方式: ' VAR RND =新的隨機(); INT NUM = rnd.Pick(新字典 {...});' –

+0

天上,好,我知道我是不是給它分配一個NUM,我只是用它。謝謝! Works Great !!! –

0

我已經看過club-keno的頁面,查看這裏列出的賠率,如果您想準確的執行,那麼這裏是我的發現和建議。如前所述,首先,所述賠率有些不準確,因爲它們對於所有可能的結果的累計概率不等於1.0。然而,底線上的「總體機率:1.74中的1」暗示了一些東西:這就是沒有得到1的可能性。事實證明,這是對於數字2到10的單獨賠率的相當精確的總和。 ,如果我們認爲這是正確的,那麼得到1的機率實際上是2.35081中的1。

因此,我計算出代表他們(幾乎)準確地代碼,那麼我們需要表示下列可能性出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 
} 

我們,當然,相信隨機數發生器的概率分佈是在整個範圍的數字持平。如果您懷疑沒有,那麼你可以減輕受一定程度,例如,使用隨機數一個更大的範圍內,比如100倍的大小,然後將測試前模的結果100000:1

int num = rnd(0, 10000000) % 100000 ; 
相關問題