Yes or No Generator 透過對瀏覽器的 Crypto.getRandomValues API 取得一個全新的 Uint32,並在完整的 0 到 2^32 − 1 範圍內,將每個偶數來源值標記為「Yes」、每個奇數來源值標記為「No」,藉此產生公平的 50/50 答案。 整個提示、它的答案以及可見的歷史紀錄都停留在你目前瀏覽器的分頁內 — 不需要帳號、不上傳、不寫入剪貼簿,也沒有 Math.random 的備援。可選的問題僅作為本機標籤使用;它永遠不會影響隨機對應,因為對應結果完全取決於每次提示新取得的單一 Uint32。歷史紀錄最多保留最新的 20 筆項目,並會明確告知你每次超過上限時究竟捨棄了多少較舊的答案。除了 Web Crypto 遺失、被封鎖或擲出例外等情況之外,產生過程既快速又無聲;在那些情況下,工具會以明確的失敗訊息停止,而不是以較弱的隨機來源替代,因此你隨時都能分辨結果何時值得信賴、何時不可信賴。

請繼續閱讀,了解對應偏置背後的方法、三步驟的工作流程、你必須知道的隱私與限制規則,以及這個提示刻意不會執行的動作。

generate yes or no answer
使用 Web Crypto 產生 Yes 或 No 答案

是什麼讓 Yes 或 No 答案公平

當每一側的機率完全相同,且隨機來源沒有在背地裡被偷偷替換時,一個二元提示才會讓人覺得公平。開放網路上大多數隨性的「yes or no」按鈕依賴的是 Math.random,它雖然快速又方便,但並非為不可預測性而設計。Math.random 在許多瀏覽器中可以從其種子重現,且官方文件中明載它是為動畫、模擬及類似輕量任務而設計的虛擬隨機來源。對於一個使用者希望相信答案並未被隱藏偏誤操控的情境而言,使用它就是錯的基礎元件。

Yes or No Generator 改為從瀏覽器的 Web Crypto Crypto.getRandomValues 方法取得每一次抽樣。這是瀏覽器用於產生加密金鑰與權杖的同一個 API,因此每次呼叫都會給出一個不可預測的 Uint32,且獨立於頁面能看見或預先計算的任何內容。可選的問題純粹作為本機標籤使用;它不會進入隨機對應,因此無論你輸入什麼、之前產生過多少答案,Yes 的機率都與 No 完全相同。

Yes or No Generator 如何建立 50/50 結果

由於結果恰好只有兩種,對應刻意保持簡單。瀏覽器會填入一個長度為一的 Uint32Array,回傳一個介於 0 到 4,294,967,295 之間(含端點)的整數。由於 2 可以整除 2^32,每一個有效的 Uint32 都落在接受範圍內,因此在一般的二元用途中不需要捨棄步驟。偶數 — 包括 0、2、4 以及最大值 4,294,967,294 — 對應到「Yes」。奇數 — 包括 1、3、5 以及最大值 4,294,967,295 — 對應到「No」。這讓每一側都剛好擁有 2^31 = 2,147,483,648 個來源值。

同一個經過測試的對應器仍然包含一條捨棄路徑,會在設定為三個或更多結果時啟動。對應器會計算出最大且不超過 2^32 的結果數倍數,拒絕達到或超過該上限的值,並以取餘數方式對接受的值進行對應。該合約針對精確的邊界案例執行確定性測試 — 零、一、中間值、最大偶數值、最大 Uint32、最後一個接受的三結果值、第一個被拒絕的值後接一個被接受的值,以及精確 128 次被拒絕的抽樣直到用盡。這些測試僅用於驗證數學;實際介面永遠不會注入假的來源。

來源值結果原因
0(以及每個直到 4,294,967,294 的偶數)Yes偶數同餘;modulo 2 = 0
1(以及每個直到 4,294,967,295 的奇數)No奇數同餘;modulo 2 = 1
2,147,483,648(2^31)Yes兩半之間的偶數邊界
4,294,967,295(最大 Uint32)No奇數最大 Uint32

由於來源空間的兩半在正常的二元用途中都會被對應而無需拒絕,所得到的 50/50 分配無論對任何單次抽樣或任何合理樣本大小都成立。合約刻意停留在這個小、無、由於支援無符號 32 位元整數所形成的有限範圍之內,以便數學可被審核,同時不對實體隨機性做出任何保證。

三個步驟產生 Yes 或 No 答案

  1. 選擇性地輸入不超過 1,000 個 UTF-16 字碼單位的低風險問題。若要單純擲硬幣,可將欄位留空;或輸入像「Order the spicy ramen?」這樣的簡短詞句。文字會與答案完全依照輸入內容儲存在本機,因此請避免貼上任何你不願留在自己瀏覽器紀錄中的內容。
  2. 選擇 Generate Yes or No。工具會向 Web Crypto 請求一個全新的 Uint32,套用上述偶數/奇數規則,並顯示當下的答案。若 Web Crypto 遺失、被封鎖或擲出例外,產生過程會明確失敗且不會新增任何答案 — 工具不會悄悄切換到 Math.random。
  3. 檢視答案與最新優先的歷史紀錄。最新的答案會顯示在可見清單的最上方,而累計捨棄訊息會明確告訴你在第二十一次產生之後究竟捨棄了多少較舊的提示。結束時請清除歷史紀錄;這是個隨性的提示,並非需要保存的紀錄。

隨機性的來源

該合約仰賴三個知名來源來支援隨機輸入機制。W3C Web Cryptography 規格是 Crypto.getRandomValues 及其如何就地填入型別化陣列的主要參考;而 Crypto.getRandomValues 的 MDN 頁面則獨立記錄了瀏覽器的行為,包括必須使用密實強的隨機來源這項要求。更廣泛的隨機位元產生器背景則來自 NIST SP 800-90A Rev. 1。工具本身從未聲稱能存取實體真隨機性或瀏覽器所選擇的底層產生器;它僅呼叫有文件記載的 API 並套用上述有限範圍的對應。

由於 Crypto.getRandomValues 在所有執行 JavaScript 的瀏覽器中皆可使用,因此在 Chromium、Firefox 以及 WebKit 基礎的瀏覽器之間體驗一致。沒有任何相依項目、網路呼叫、ObjectURL 或剪貼簿寫入 — 該頁面不需要將你的提示傳送到伺服器,就能請求一個隨機數。

可選問題的限制

問題欄位確實是可選的,不過其內容仍有規則。合約最多接受 1,000 個 UTF-16 字碼單位,達到上限的內容允許,超過一個字碼單位則會失敗且不會截斷。空白文字有效,因為問題本為可選;在這種情況下,歷史紀錄的標籤會顯示「No question」。在已顯示答案後編輯問題,會清除目前答案與任何先前的錯誤,避免舊答案被新措辭誤標 — 不過編輯動作並不會從歷史紀錄中移除該項目。

修整(trimming)僅用於判斷標籤是否應顯示「No question」,絕不會套用到底層儲存的文字上。包含尾端空格、表情符號或附音標字元的貼上問題,會完全依照輸入時的內容儲存,並以與純 ASCII 相同的方式計入 1,000 字碼單位的上限。

閱讀 20 筆歷史紀錄

歷史紀錄是有上限的使用者介面清單,而非悄悄的輪替淘汰。第二十一次產生之後,最舊的項目會被移除,捨棄計數器加一。累計訊息會明確告訴你究竟有多少較舊的答案已被捨棄,讓上限變得可見,而不是讓你納悶是否有東西不見了。

狀態保留的內容被移除的內容
前 20 次產生所有項目,最新優先無
第 21 次產生之後最新的 20 筆項目,加上捨棄計數器每次產生時最舊的那一筆
已清除的歷史紀錄空白的可見清單,重設捨棄計數器可見項目、捨棄計數器、目前答案

本機項目識別碼是嚴格遞增的,僅用於避免單一產生工作階段中的重複執行階段鍵;它並非隨機資料,也非持久識別碼。清除歷史紀錄也會一併移除目前顯示的答案,因此下一個提示會從全新的狀態開始。

本產生器不會做的事

這是個隨性的提示,並非建議。合約明確告訴你不要將它用於醫療、法律、財務、安全關鍵性、緊急情況、同意與否、僱用、資格認定、法規遵循或其他高風險決策。Web Crypto 的品質並不會讓問題變得合適、不會驗證可用的選項、不會理解後果,也不會提供專業判斷。一個數學上平衡的答案,在用於低風險情境之外時,仍可能是不合適、不幸或有害的。

本產生器也不會學習偏好、為選項加權、保證結果輪流出現,或防止連續結果。獨立的 50/50 抽樣本來就可能自然產生連續的 Yes 或連續的 No;近期歷史紀錄僅供描述,絕不會為了補償連續出現的情形而調整機率。若你想要一個互補機制 — 例如,給最後兩次產生一個輕微的傾向以打破小型僵局 — 請改為搭配一個 Coin Flip,而不是把這個工具強加上它並非設計來執行的規則。

理解了方法與限制之後,你就能在完全明瞭工具做什麼、不做什麼、以及什麼會留在你機器上的前提下,持續產生 50/50 的答案。

若想深入了解,請參閱在你的瀏覽器中隨機產生 Yes 或 No。

若想深入了解,請參閱不使用轉盤產生 Yes 或 No 轉盤結果。