2012-04-09 121 views
7

我見過這個問題有很多種方式,但我只需要對我在這裏做什麼進行一次完整性檢查。c#概率和隨機數

基本上我希望觸發基於使用1到100之間產生的隨機數具有25%的概率的事件:

int rand = random.Next(1,100); 

將以下實現這一目標?

if (rand<=25) 
{ 
    // Some event... 
} 

我想我會使用1到100之間的數字,以便稍後調整概率 - 例如,通過使用調整至23%

if (rand<=23) {...} 

感謝您的關注。

+1

你試過了嗎?它應該工作正常。注意,不要在短時間窗口內重新創建許多「隨機」實例,否則它們將返回相同的「隨機」結果。 – mellamokb 2012-04-09 21:12:06

+0

我不想使用1到4,因爲如果需要的話,我想稍後調整,但是是的,1,4會相同。謝謝斯科特,我錯過了。 – CdrTomalak 2012-04-09 21:13:30

+0

這聽起來是正確的。 – 2012-04-09 21:14:05

回答

5

Next(int, int)的第二個參數是所需範圍結果的exclusive upper bound。因此,您應使用此:

if (random.Next(0, 100) < 25) 

,或者,如果你必須使用基於1的邏輯,

if (random.Next(1, 101) <= 25) 
+0

這很有趣,因爲我認爲我可以嘗試使用相同的隨機數通過'if((rand> 25)&&(rand <= 50)){...}來觸發另一個25%的機會事件。但是我想只要按照你的建議做一系列的if語句就行了? – CdrTomalak 2012-04-09 21:19:25

+0

@CdrTomalak根本不起作用。如果您的第一個事件*被調用,則調用下一個事件的概率爲零。如果第一個事件是*未被調用,則調用下一個事件的概率爲1/3。如果您重複使用隨機數,事件將不再獨立隨機;因爲這兩種事件都不會發生。 – phoog 2012-04-09 21:22:44

+0

@CdrTomalak另一方面,如果你想隨機選擇四個事件中的一個,你就走在正確的軌道上;您需要對零基數字使用'if(rand> = 25 && rand <50)',因爲下限是包含性的,並且上限是包含性的。對於基於1的數字,您的表達將是正確的。 – phoog 2012-04-09 21:30:50

8

您所做的最大的錯誤是應該random.Next(0,100)作爲documentation states

minValue:返回的隨機數的包含下界。

maxValue:獨佔返回的隨機數的上限。 maxValue必須大於或等於minValue。

Emphisis mine,exclusive表示它不包含您通過的號碼,所以我的代碼生成範圍0-99,您的代碼生成範圍1-99。

所以更改您的代碼

int rand = random.Next(0,100) 

if (rand < 25) //25% 
{ 
    // Some event... 
} 

//other code 
if (rand < 23) //23% 
{ 
    // Some event... 
} 

<=<的變化是因爲你現在使用專用上限範圍

5

您也可以使用此代碼(通常爲百分比計算雙間0和1被使用):

double rand = random.NextDouble(); 
if(rand < .25) 
{ 
... 
+0

這應該是'if(rand <.25)';上限是獨佔的:http://msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx – phoog 2012-04-09 21:18:48

+0

謝謝。如果你不介意,我編輯了我的答案。但是,雙倍沒有太大的區別。 (只有當像0.249999999 ...和0.25這樣的數字發揮作用時纔有差別,這不會破壞1/4概率的圖像) – 2012-04-09 21:20:36

+0

是的,差異非常小(精確的影響取決於NextDouble函數的多少個離散值當然可以返回)。我猜想如果算法非常敏感以至於有所作爲,那麼它應該首先使用真隨機數而不是僞隨機數。 – phoog 2012-04-09 21:27:09