2013/09/27

亂數實作機率為何不靈光?

我們一般用亂數來實作機率。例如,下面這段程式碼:

p = irandom(10);
if(p <= 2) {
//受管制的程式碼
}


受管制的程式碼執行的機率是0.3(子數可能值是0, 1, 2, 母數可能值是0..9)。
然而,實際執行時,我們都會發現,受管制的程式碼卻彷彿不受控制般,永遠都會執行,為什麼?機率控制的機制失敗嗎?
並沒有,受管制的程式碼仍以0.3的機率執行著,問題出在重複的次數。
遊戲設計中,我們必須設定其fps,也就是畫面每秒鐘的更新次數。一般而言,我們取預設值為30。以此數值為例,前面那段受管制的程式碼會再1秒鐘內平均執行0.3*30=9次!感覺起來便是有如管制失效一般。
簡單的解決方法是將母數改成以時間為單位,而不是以檢測管制公式的次數為單位。例如,將前述的程式碼中,p改成:

p = irandom(fps);

則受管制的程式碼執行的機率便會變成『每秒3次』。