「是或否」轉盤透過在兩個結果——「是」與「否」——之間各以相等的機率做出選擇,產生一個隨性的二元答案。在公平的實作中,每個結果的機率完全相同。「是或否」產生器採用相同的轉盤式結果呈現,但使用的是瀏覽器內建的 Web Crypto API,而非視覺上的轉動動畫,因此每一個答案都由密碼學安全隨機源所支持,而不是單純落在某個格子上就結束的動畫。此工具會從 Crypto.getRandomValues 取得一個 32 位元無符號整數,並放入一個長度為一的 Uint32Array 中,產生一個介於 0 到 4,294,967,295 之間的整數。因為 2 可以整除 2^32,每一個有效的 Uint32 值都會被接受,不需要進行拒絕取樣;偶數對應「是」,奇數對應「否」,因此每個結果恰好對應 2,147,483,648 個來源數值。此工具完全在目前的瀏覽器分頁中執行,絕不會上傳問題內容或歷史紀錄,也不要求帳號或任何網路請求,因此非常適合用於以平衡的 50/50 提示為目標的隨性決策。

generate yes or no wheel
無需轉盤動畫即可產生「是或否」轉盤結果

「是或否」轉盤結果與加密提示有何不同

典型的「是或否」轉盤是一個數位轉盤,會隨機停在「是」或「否」上,以解決小額、低風險的選擇。大多數公開的轉盤工具依賴可見的旋轉動畫,加上底層的偽隨機數來決定指針會停留在哪一片格子上。動畫增添了娛樂價值,但結果的公平性完全來自底層的隨機源,而非取決於轉盤轉了多久或顏色如何排列。

「是或否」產生器省略了動畫,直接呈現答案,其來源依據 MDN 對於 Crypto.getRandomValues 的說明文件,並符合 W3C Web Cryptography API 規範中關於就地填入整數型別陣列的定義。這種方式的好處在於方法論十分明確:每一次產生都只從密碼學安全的瀏覽器 API 讀取恰好一個 Uint32,透過一個經過測試的函式進行映射,然後回傳「是」或「否」。既不需要等待動畫結束,也不需要憑空信任某個不透明的演算法。

對於仍希望保有「轉盤」感覺的讀者,此工具會顯著記錄目前的答案,並持續顯示最新的結果,讓整個頁面就像一份轉盤紀錄的書面日誌,卻沒有視覺上的花俏外觀。其代價在於體驗更為平靜、透明,而非遊戲化,這正符合那些比起炫目效果更重視可驗證 50/50 提示的快速決策需求。

如何產生「是或否」轉盤的答案

  1. 在瀏覽器分頁中開啟「是或否」產生器。頁面載入時,問題欄位為空,也不會顯示目前的答案。
  2. 選擇性地在問題欄位中輸入一個最多 1,000 個 UTF-16 字碼單位的低風險問題。該問題僅作為本機標籤,不會改變答案的機率;若你願意,可將其留白。
  3. 點擊「產生」按鈕,從 Web Crypto 抽取一個 Uint32,並將其映射為「是」或「否」。目前的答案會顯示在頁面上。
  4. 檢視答案及其周圍的歷史紀錄。編輯問題欄位會清除目前所顯示的答案以及先前所有的錯誤狀態,避免舊的答案被誤認為新的答案;歷史列表本身會予以保留。
  5. 你可以視需要重複執行「產生」步驟任意次數。最新優先的歷史紀錄會保留最近 20 筆結果於畫面上;當你超過 20 筆時,一個持續累加的計數會精確告訴你已經被捨棄的先前答案數量。
  6. 結束時,如果不想讓最近的答案繼續顯示於畫面上,請清除歷史紀錄。

二元映射:偶數對應「是」,奇數對應「否」

轉盤結果的公平性來自於刻意設計的簡單映射。瀏覽器透過 Crypto.getRandomValues 將一個長度為一的 Uint32Array 填滿,回傳一個整數 n,其中 0 ≤ n ≤ 4,294,967,295(即 2^32 − 1)。接著映射函式會依序套用以下兩條規則。

首先,對於一般的 N 個結果提示,映射器會計算不超過 2^32 的最大 N 的倍數,接受嚴格小於該倍數的值,並拒絕大於或等於該倍數的值。對於「是或否」轉盤,N 等於 2,而在不超過 2^32 的情形下,2 的最大倍數就是 2^32 本身,因此每一個有效的 Uint32 都會被接受,不需要進行拒絕取樣。這點十分關鍵,因為不同的 N(例如 3)會迫使映射器捨棄大於或等於 floor(2^32 / 3) × 3 的值,以維持每個結果出現的機率相同。

其次,被接受的值 v 會對 N 取餘數。當 N 為 2 時,結果為 0(對應「是」)或 1(對應「否」)。最直觀的規則就是「偶數對應『是』,奇數對應『否』」。在總數 2^32 個來源值中,每個結果恰好獲得 2,147,483,648 個值。一個計算範例:抽到的值為 4,294,967,294(即 2^32 − 2,為偶數)會被接受,接著 4,294,967,294 除以 2 餘數為 0,因此結果為「是」。抽到的值為 4,294,967,295(即 2^32 − 1,為奇數)會被接受,接著除以 2 餘數為 1,因此結果為「否」。

一個最多 128 次迴圈的上限機制可以防止來源損壞或遭到注入而導致無限迴圈;在一般使用情況下,迴圈會在第一次抽樣時就結束,因為二元結果並不需要進行拒絕。映射器也會在具有三個結果的邊界條件下,以確定性測試進行驗證,以便即使二元提示永遠不會觸發該路徑,拒絕路徑仍會受到檢驗。隨機序列中自然可能出現連續的「是」或連續的「否」,且順序不限,映射器並不會為了消除連續結果而做出補償,也不保證結果會交替出現。

讀取最新優先的 20 筆歷史紀錄

每一次產生都會將一列附加到最多保留 20 筆的最新優先歷史清單中。當進行到第 21 次產生時,最舊的紀錄會被捨棄,並會更新一則累計訊息,精確反映自上次重設(頁面載入或清除)以來已經被捨棄的答案數量。每一列的標籤會使用你輸入的問題文字;若問題為空,則會顯示字面標籤「No question」。

歷史紀錄僅供描述用途。連續看到多個「是」並不會提高下一次抽到「否」的機率;連續看到多個「否」也不會提高下一次抽到「是」的機率。獨立的 50/50 結果在任何長度下都可能自然形成連續結果,包括連續的「是」或連續的「否」,此工具既不會為了消除連續結果而做出補償,也不保證結果會交替出現。請將這份清單用於比較最近的提示,而不是用於預測下一次結果。

編輯問題欄位只會清除明顯顯示的目前答案以及先前所有的錯誤狀態,歷史本身會保留不動。清除歷史紀錄會同時重設可見的列與被捨棄的計數,也會移除目前的答案,讓頁面回到空白狀態。一個單調遞增的本機項目識別碼可以在頁面的生命週期內維持執行階段鍵值的唯一性;它既不是隨機資料、不是持久的識別碼,也不是可以在重新載入後存活的計數器。

限制、邊界與不應使用隨機提示的時機

問題欄位最多接受 1,000 個 UTF-16 字碼單位。剛好為 1,000 個單位的邊界值會被接受;超過一個字碼單位則會直接失敗,而不會截斷或產生結果,因此此工具絕不會在無聲的情況下截斷過長的問題。空白文字是合法的,因為問題本身是可選的。問題文字會以你輸入時的樣子,與產生的項目一起儲存於本機;修剪動作僅用於判斷歷史紀錄是否應顯示「No question」標籤。

若 Web Crypto 缺失、被封鎖或拋出例外,此工具會回報一個明確的失敗訊息,而不會產生任何答案。不會回退到 Math.random,因為在無聲的情況下變更來源會與所顯示的方法論相矛盾。若你看到錯誤訊息而非「是」或「否」,代表你的瀏覽器環境不支援此提示,此時你應採用其他方法。瀏覽器的實作會自行選擇其底層產生器,因此此工具並不宣稱可存取實體上的真亂數,也不會公開產生器的演算法。

即使是一個完美平衡的隨機提示,也並非建議。請勿將此工具用於醫療、法律、財務、安全關鍵、緊急狀況、資安、同意、就職、資格、合規或其他高風險的決策。Web Crypto 的品質並不會讓問題變得合適、無法驗證可用的選擇、無法理解後果,也無法提供專業判斷。一個數學上平衡的答案,在應用於隨性、低風險的情境之外時,仍可能不適合、不幸或有害。此工具不會學習偏好、不會為選項加權、不會防止連續結果、無法在小樣本下證明公平性,也無法預測未來事件。

「是或否」轉盤提示一覽

下表整理了幾種常見的二元提示做法,在對隨性公平性真正重要的屬性上進行比較。表中僅使用此工具於公開文件中揭露的特性,並未引用來自外部測試的量測效能。

做法隨機來源可見動畫問題標籤每次答案的歷史紀錄
「是或否」產生器(本工具)Crypto.getRandomValues,一個 Uint32否可選,最多 1,000 個 UTF-16 字碼單位最新優先,最多 20 筆
視覺化的「是或否」轉盤視實作而定,通常為 JS 隨機數產生器是通常沒有有時為計數器,少數為清單
擲硬幣式提示通常為 Math.random 或等效作法有時罕見罕見

本表的重點並非在於哪個工具在各方面都更優秀,而在於每種做法在公開文件中揭露的屬性並不相同。當你需要透明的方法論、帶標籤的問題,以及可見的近期歷史時,「是或否」產生器會明確地展示以上每一項。當你需要可見的旋轉動畫時,轉盤式頁面可能更適合你,但請理解動畫僅為裝飾性質,真正負責產生結果的是其底層的來源。

若你正在權衡各種選項,《隨機名字挑選轉盤入門指南》對此有詳細說明。