數字挑選器是一個小型程式,會從您定義的範圍中回傳一個或多個隨機整數,該範圍內的每個整數(包括兩端點)出現的機率都相等。此處提供的挑選器接受三個輸入:最小整數、最大整數,以及介於 1 到 1,000 之間的結果數量,然後以逗號分隔的清單形式回傳整數供您複製。它完全在您的瀏覽器中執行,從 Web Crypto 介面取得隨機性,並使用拒絕取樣法來確保範圍內的每個整數被選中的機率相同,而不會受到不均勻的模運算所偏誤。兩個邊界都可以是負數,可允許或不允許重複值,而無法滿足的要求(例如從範圍大小為 3 中取出 5 個不重複的值)會預先被拒絕並顯示明確的錯誤訊息,而不是進入迴圈或默默地回傳較少的數字。本文將帶您了解挑選器的運作方式、輸出為何公平,以及具體的使用方法。

number picker explained
數字挑選器解析:公平的隨機整數如何運作

數字挑選器實際上做了什麼

理解數字挑選器最簡單的方式,就是將它視為一個函式 f(min, max, count),回傳一個整數清單。您定義一個包含端點的範圍 [min, max],決定想要取得多少個整數,挑選器就會回傳它們。「包含端點」這個詞具有實質意義:1 到 10 的範圍包含 1 和 10 以及介於其間的每個整數,因此這十個值中的任何一個都可能成為結果。如果 min 和 max 是相同的數字,那麼唯一可能的結果就是該數字。

兩個側邊控制項決定了回傳清單的類型。結果數量告訴挑選器每次要產生多少個整數,從 1 到 1,000 個。重複值切換會改變連續抽樣之間的關係:啟用重複值時,每次抽樣都是獨立的,相同的數字可以在輸出中出現多次,這正是您在重複模擬或希望先前結果仍符合資格的事件中所需要的。停用重複值時,挑選器保證清單中沒有任何整數出現兩次,這正是您在選擇不同的位置、識別碼或編號參與者時所需要的。

兩個邊界都可以是負數或跨越零。包含端點的範圍運作方式仍然相同:從 −5 到 5 意味著從 −5 到 5 的每個整數都是候選值。邊界唯一的限制是它們必須是 JavaScript 安全整數,也就是瀏覽器能夠精確表示的最大整數範圍。任何超出該範圍的值都無法誠實地對應,因此挑選器會拒絕它。

工具如何無偏誤地挑選數字

天真的隨機數產生器會取得原始隨機值並套用餘數運算(模運算),將其對應到目標範圍中。當來源範圍不是目標範圍的精確倍數時,這種方法就會產生偏誤:殘餘的尾部值會被對應到較前面的輸出,而不是較後面的輸出。對於需要使用者選定範圍內每個整數出現機率相等的挑選器而言,這種偏誤是不可接受的。

挑選器透過拒絕取樣法避開了這個問題。瀏覽器透過 Web Crypto 的 getRandomValues 呼叫提供原始的 32 位元隨機字詞,再將其組合成為 53 位元非負整數——這是 JavaScript 能夠精確保存的最大值。挑選器從一個剛好足以涵蓋包含端點範圍的視窗中要求一個原始值,並捨棄落入不完整尾部的任何值,然後再將接受的值對應到範圍中的特定整數。

一個具體的例子可以讓這個模式更清楚。假設包含端點的範圍是 1 到 3,那麼範圍大小為 3。一個 2 位元的原始值可以是 0、1、2 或 3。3 是小於 4 的最大 3 的倍數,因此原始值 0、1 和 2 被接受,而原始值 3 被拒絕並重新抽取。然後對應將 0 → 1、1 → 2 和 2 → 3,每個輸出都恰好對應一個被接受的原始值,因此機率相等。相同的邏輯可以延伸到任何安全整數範圍:包含端點範圍中的每個整數都會獲得相同數量的可能接受原始值。

當挑選器在停用重複值的情況下需要不重複的值時,它不會為潛在的巨大範圍中的每個整數建立陣列。相反地,它使用稀疏的部分 Fisher-Yates 洗牌法,以 O(count) 的記憶體挑選不重複的偏移量,即使在僅要求少量數值的極大範圍中也能保持回應快速。

隨機性本身來自瀏覽器內建的 Web Crypto 介面,而非 Math.random,因為後者並非為加密強度所設計。MDN 對 Crypto.getRandomValues 的參考文件是說明瀏覽器如何公開此熵來源權威性描述。

如何使用數字挑選器

開啟隨機數產生器並設定三個輸入,然後產生。

  1. 在下限欄位輸入最小安全整數,在上限欄位輸入最大安全整數。兩個端點都是合格的結果,因此從 1 到 10 的範圍可以產生 1 或 10。
  2. 選擇介於 1 到 1,000 之間的結果數量,並透過保持重複值設定為開啟或關閉來決定是否允許重複數字。
  3. 選擇產生數字。只要任何輸入變更,先前的結果清單就會自動清除,因此您看到的清單始終符合目前的設定。
  4. 檢視以逗號分隔的輸出,然後選取並複製以用於您的活動、資料集或文件中。

若要對小範圍內的每個整數進行唯一的隨機排序,請將數量設定為等於範圍中的整數數量並停用重複值。對於重複實驗,請保持啟用重複值,並在需要新的獨立樣本時重新產生清單。

設定及其影響

四個使用者面向的控制項——最小值、最大值、數量和重複值——以少量可預測的方式互動。下表總結了您可以從每種組合中預期的行為。

設定行為最適用於
允許重複值獨立抽樣;相同的值可能在輸出清單中出現超過一次。重複模擬、擲骰子類型的實驗、抽取後放回的抽樣。
停用重複值輸出中的每個值都是唯一的;挑選器不會回傳相同的整數兩次。選擇不同的位置、抽取編號的參與者、指派唯一的 ID。
數量 = 1回傳單一整數。快速決策、50/50 類型的選擇(範圍為二)、一次性抽樣。
數量 = 範圍大小且重複值為關範圍內每個整數的隨機排列。小範圍內每個值的隨機排序。
數量大於範圍大小且重複值為關在任何抽樣發生之前,請求會被拒絕並顯示明確的錯誤。不可能的不重複請求會預先被攔截,而不是進入迴圈或默默地截斷。

您選擇的組合只會改變輸出,而不會改變底層的隨機性:無論數量或重複值偏好為何,每個被接受的原始值出現的可能性仍然相等。

何時數字挑選器是合適的工具——以及何時不適合

數字挑選器非常適合需要不可預測的整數的日常工作:課堂活動、抽獎、隨機化的測試資料、順序選擇和遊戲設定。由於該工具在本機執行且絕不上傳您的資料,因此您的邊界和結果會保持在目前的瀏覽器分頁中為私有,不會離開您的電腦。

挑選器不能取代經過稽核的彩票、賭博或加密金鑰系統。它不會公開種子、簽署過的記錄、外部隨機性信標或可重現的稽核軌跡,訪客之後也無法證明是哪個瀏覽器熵產生了特定的清單。對於受規範的獎品抽獎、存取控制、密碼、權杖或任何重大決策,請遵循您組織所要求的獨立稽核程序,而不是依賴通用的瀏覽器工具。

對於特殊情境——指令碼語言、試算表、命令列工作或程式化 API——相同的任務可能以不同的方式解決。此挑選器的輸入、限制和設定的實用參考彙整於數字挑選器速查表,它以快速查詢的方式補充了此概念性說明。

輸入限制與您可能會看到的錯誤

輸入受到限制有兩個實際原因:瀏覽器無法精確表示每個整數,而靜默的四捨五入會讓請求看起來成功,但其邊界並非預期的內容。挑選器強制執行一組明確的小限制。

  • 兩個邊界和包含端點的範圍大小都必須是 JavaScript 安全整數。較大的數字文字無法始終由瀏覽器精確表示,因此超出該範圍的值會被拒絕。
  • 反向邊界(最大值小於最小值)會被拒絕,空白欄位、小數值、無限大以及其他非整數的輸入也一樣會被拒絕。
  • 不重複請求的數量超過包含端點範圍的大小時,會被拒絕並顯示明確的錯誤。無法從 1 到 3 中取出 5 個不重複的值,因為該範圍僅包含三個整數。
  • 每次操作最多回傳 1,000 個整數。此上限可防止意外產生消耗大量記憶體的請求,並使錯誤保持可見,而不是讓工具悄悄地交回截斷的清單。

如果您需要超出安全整數範圍的任意精度值——例如加密大小的數字——請使用接受整數字串而非一般瀏覽器數字的專業系統。對於其他所有一般請求,這些限制使挑選器可預測且錯誤明顯。

相關閱讀:D100 擲骰子:在您的瀏覽器中擲出公平的 1–100。