2010-11-01 115 views
0

我試圖做一個模擬器基於百分比,並由一個整體改變...什麼是最好的方式來做到這一點?根據另一個百分比模擬一個計算的百分比

我們想模擬,例如,一個鞦韆。 20%來計算某些事情是由於整個擊球手和投手的結果,並確定他是否擊球。所以,如果他打的球,爲他做了一個本壘打,一個犯規球,命中...等

感謝

+5

「有很多MOT唯一的一個隨機「?!?? – Stephen 2010-11-01 19:23:39

+2

問題不清楚 – Adam 2010-11-01 19:24:56

+2

我不知道該怎麼解析「有很多mot只是一個隨機......」 – 2010-11-01 19:26:32

回答

2
private static Random rand = new Random(); 

public static T ChooseRandomOutcome<T>(Dictionary<T,int> relativeWeights) 
{ 
    Random rand = new Random(); 

    var total = relativeWeights.Values.Sum(); 
    var randomValue = rand.Next(total); 
    var runningSum = 0; 
    foreach (var pair in relativeWeights) 
    { 
     if (randomValue < pair.Value) 
     { 
      return pair.Key; 
     } 
     runningSum += pair.Value; 
    } 
    throw new Exception("This should never happen.");  
} 

用法:

public Enum PitchOutcome 
{ 
    Ball, 
    Strike, 
    Hit 
} 

public Enum HitOutcome 
{ 
    PopFly, 
    HomeRun, 
    Single, 
} 

var weights = new Dictionary<PitchOutcome, int>(); 
weights.Add(PitchOutcome.Ball, 40); 
weights.Add(PitchOutcome.Strike, 30); 
weights.Add(PitchOutcome.Hit, 30); 
PitchOutcome randomOutcome = ChooseRandomOutcome(weights); 
// it should be a Hit 30% of the time. 

if (randomOutcome == PitchOutcome.Hit) 
{ 

    var hitWeights = new Dictionary<HitOutcome, int>(); 
    hitWeights.Add(HitOutcome.PopFly, 50); 
    hitWeights.Add(HitOutcome.HomeRun, 5); 
    hitWeights.Add(HitOutcome.Single, 45); 
    HitOutcome hitResult = ChooseRandomOutcome(hitWeights); 
} 
+0

我已經嘗試過這一點,對於這個例子,如果我比較MLB,本壘打來了太多時間。比如說,有5倍到10倍的時間。如果它只有失敗或成功,我該怎麼辦?讓我們說:這是一個犯規球,本壘打,抓球等嗎? – 2010-11-01 19:27:53

+0

@Simon我認爲你將不得不更清楚你在找什麼。 – McKay 2010-11-01 19:34:33

+1

@McKay:抱歉,我試過了,但我平時說法語,很難解釋這個難題......我試過了,但看起來我失敗了...... – 2010-11-01 19:37:06