無法預測的骰子:哪裡出了問題,我們改了什麼
我們發現,線上對局的骰子原則上可以在擲出前被算出來:它的種子由每位玩家都看得到的資訊構成。我們沒發現有人這麼做過。自 10 月 1 日起,每次擲骰的種子都來自只有伺服器掌握的金鑰,舊的預測如今每 36 次才對 1 次——純屬運氣。

通俗版
以下是我們的發現。線上對局裡一切隨機的東西——兩顆骰子、抽機會卡、大獎骰子——都來自一個亂數產生器,而產生器必須從一個種子開始。我們的種子由每位玩家都看得到的兩樣東西構成:對局 id(就在你的網址列裡),以及這一步的編號(遊戲在每次操作後都會回傳它)。產生器本身是普通的公開程式碼。把這些湊在一起,懂門道的人本可以在擲骰之前就算出結果——原則上甚至還能挑選接下來幾次擲骰中自己拿到哪一次。
我們是在真實對局上驗證的,而不是紙上談兵。修正前的最後 2,000 次擲骰中,有 1,985 次——也就是 99.3%——和這些公開資訊的預測完全一致。
有人利用過它嗎?
接著我們調查了是否有人利用過它,結果一個也沒有。最能直接從「預知擲骰結果」獲利的,是大獎投注。修正前的七天裡,2,354 次大獎投注的勝率為 31.4%,而純靠運氣的預期是 31.1%,也沒有任何玩家的紀錄顯得異常。
常見問題
opolyx 的骰子公平嗎?
公平。在 2026 年 10 月 2 日至 6 日的 247,968 次擲骰中,每顆骰子的每個點數出現的比例都在 16.54% 到 16.77% 之間——完美骰子的理論值是 16.67%——對子出現的比例為 16.67%。
opolyx 的骰子能被預測嗎?
不能——自 2026 年 10 月 1 日起就不能了。每次擲骰的種子都來自一把只存在於伺服器上的金鑰,舊的預測如今只能命中 2.76% 的擲骰,正是閉著眼睛亂猜兩顆骰子時會得到的 2.78%。
有人利用過骰子的舊漏洞嗎?
我們沒有發現任何跡象。修正前的七天裡,2,354 次大獎投注的勝率為 31.4%,而純靠運氣的預期是 31.1%,也沒有任何玩家的結果顯得異常。
擲骰結果是在哪裡決定的?
在遊戲伺服器上,在你擲骰的那一刻,由一個亂數產生器決定,它的種子來自一把別人都沒有的金鑰。結果會寫進對局紀錄檔,重播和統計讀取的是紀錄檔,而不是重新擲一次骰子。
技術細節
種子原本是一個形如 <對局 id>:<步驟編號> 的標籤,先用 FNV-1a 做雜湊,再交給 mulberry32。這種設計是刻意的——它讓每一局都能依據自己的紀錄檔完整重現——但重現從來不需要種子是公開的。每個結果都寫在產生它的那個事件裡,重播和統計讀取的是這些事件,而不是重新擲一次骰子。
// before: anyone who knew the game id and the move number could do this
rng = mulberry32(fnv1a(`${gameId}:${seq}`))
// after: the same label, signed with a key that never leaves the server
rng = mulberry32(uint32(hmacSha256(serverSecret, `${gameId}:${seq}`)))現在,這個標籤會先經過 HMAC-SHA256,金鑰是一段只存在於伺服器內部的 32 位元組秘密值。預設情況下,伺服器每次啟動都會重新產生這把金鑰。沒有任何東西需要它在重新啟動後保留下來,因為過去的擲骰從不會被重新計算——而一把從未被寫下來的金鑰,就是一把不可能外洩的金鑰。
遊戲中每一次具決定性的隨機抽取都以這種方式簽章:骰子、機會卡、大獎骰子,以及誰先行動的選擇。
骰子也正如骰子該有的那樣公平。在 10 月 2 日以來的全部擲骰中——共 247,968 次——每顆骰子的每個點數出現的比例都在 16.54% 到 16.77% 之間,而完美骰子的理論值是 16.67%;對子出現的比例為 16.67%:
| 點數 | 第一顆骰子 | 第二顆骰子 |
|---|---|---|
| 點數 1 | 16.75% | 16.72% |
| 點數 2 | 16.77% | 16.65% |
| 點數 3 | 16.56% | 16.61% |
| 點數 4 | 16.54% | 16.70% |
| 點數 5 | 16.67% | 16.70% |
| 點數 6 | 16.72% | 16.62% |
修正以和問題相同的標準做了檢驗。修正前命中率達 99.3% 的那套預測,在修正後又用一整天的資料重新跑了一遍:它在 50,212 次中命中了 1,388 次,也就是 2.76%——正是閉著眼睛亂猜兩顆骰子時應有的 2.78%。
