蒙地卡羅演算法(Monte Carlo algorithm)
想像一種快速健康篩檢,每次都恰好五分鐘完成,但偶爾會給出錯誤的讀數。你喜歡它總是快,並能接受那一點點出錯的機會——而且你可以重複它來縮小這個機會。蒙地卡羅演算法與拉斯維加斯做相反的取捨:它固定(通常非常快的)執行時間,但答案只是很可能正確。
精確地說:蒙地卡羅演算法使用隨機性,在固定的時間界限內執行,回傳的答案至少以某機率 p 正確;以機率 1 − p 可能出錯。一種漂亮的模式是單邊測試:說「是」永遠可信,但說「否」可能是偽陰性(或反過來)。弗萊瓦爾德斯(Freivalds)檢查 A 乘 B 是否等於 C 就是這樣:它挑一個隨機向量 r,測試 A(Br) 是否等於 Cr;若矩陣相等它總是說相等,若不相等它至少以二分之一的機率抓到差異。關鍵手法是放大:跑 k 次獨立試驗並合併。在單邊測試裡,任何一次「抓到了」就一錘定音,因此 k 次執行把錯誤壓到最多 (1/2)^k——跑十次就已使錯誤低於千分之一。
當速度與穩固的時間界限比確定性更重要、且你能容忍(並界定)一點小錯時,蒙地卡羅就是對的模型——質數測試(Miller-Rabin)、用指紋做相等檢查、卡格最小割。誠實的提醒:「很可能正確」不等於「正確」。你必須陳述錯誤機率;而對雙邊錯誤,要記得重複需要多數決,而非單次幸運命中。試驗的獨立性至關重要;重用同一組隨機位元並不會降低錯誤。
一個單邊的蒙地卡羅檢測:要判斷一個長位元字串是否全為零,抽樣 20 個隨機位置。若任一抽到的位元是 1,回答「並非全零」(永遠正確)。若 20 個都是 0,回答「全零」——只有當你漏掉了某些 1 時才會錯,而當 1 很常見時這不太可能。
固定時間、答案可能出錯:靠重複獨立試驗來放大正確率。
命名很容易搞混:蒙地卡羅固定時間、賭答案;拉斯維加斯固定答案、賭時間。「很可能正確」要求你真的說出錯誤界限,而放大只有在重複試驗使用全新獨立隨機性時才有效。