我試圖做一個模擬器基於百分比,並由一個整體改變...什麼是最好的方式來做到這一點?根據另一個百分比模擬一個計算的百分比
我們想模擬,例如,一個鞦韆。 20%來計算某些事情是由於整個擊球手和投手的結果,並確定他是否擊球。所以,如果他打的球,爲他做了一個本壘打,一個犯規球,命中...等
感謝
我試圖做一個模擬器基於百分比,並由一個整體改變...什麼是最好的方式來做到這一點?根據另一個百分比模擬一個計算的百分比
我們想模擬,例如,一個鞦韆。 20%來計算某些事情是由於整個擊球手和投手的結果,並確定他是否擊球。所以,如果他打的球,爲他做了一個本壘打,一個犯規球,命中...等
感謝
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);
}
我已經嘗試過這一點,對於這個例子,如果我比較MLB,本壘打來了太多時間。比如說,有5倍到10倍的時間。如果它只有失敗或成功,我該怎麼辦?讓我們說:這是一個犯規球,本壘打,抓球等嗎? – 2010-11-01 19:27:53
@Simon我認爲你將不得不更清楚你在找什麼。 – McKay 2010-11-01 19:34:33
@McKay:抱歉,我試過了,但我平時說法語,很難解釋這個難題......我試過了,但看起來我失敗了...... – 2010-11-01 19:37:06
「有很多MOT唯一的一個隨機「?!?? – Stephen 2010-11-01 19:23:39
問題不清楚 – Adam 2010-11-01 19:24:56
我不知道該怎麼解析「有很多mot只是一個隨機......」 – 2010-11-01 19:26:32