命令列數字挑選器是一個 shell 指令或短腳本——通常是 shuf、$RANDOM 或一行式 Python——能在不啟動圖形應用程式的情況下,從指定範圍回傳一個整數;而線上數字挑選器則是一個以瀏覽器為基礎的工具,透過表單欄位完成同樣的工作,其實際的隨機來源不是在本機網頁中執行,就是存放在遠端伺服器上。兩者都能產生整數;實際差異在於設定、可重現性、公平性,以及誰能在不需要協助的情況下使用結果。命令列方法能嵌入腳本與管線、在終端機留下稽核紀錄,並在你控制種子時具備可重現性,但它假設操作者擁有 shell、熟悉語法,並信任主機的熵池。線上挑選器以可及性換取這種控制權——任何有瀏覽器的人都能使用——而較好的工具會完全在 JavaScript 中執行隨機抽樣,因此不會有任何數值離開裝置。在兩者之間做選擇,取決於是誰在產生該數字、結果是否需要在日後重現,以及你實際需要多少腳本化程度。

用命令列挑選隨機數字的方法
挑選隨機整數最常見的命令列作法簡短到能放在一行。在 Linux 與 macOS 上,shell 工具 shuf 接受範圍與輸出數量:shuf -i 1-100 -n 1 會在 1 到 100 之間(包含 1 和 100)印出一個整數,shuf -i 1-100 -n 5 則會印出五個。shuf 使用系統的隨機來源,因此其品質取決於作業系統——在 Linux 上它從 /dev/urandom 取得隨機數,這適用於一般用途的抽樣,但並不適合用於密碼學金鑰。
Bash 內建的 $RANDOM 更為簡潔:echo $((RANDOM % 100 + 1)) 會回傳 1–100 之間的整數。然而,模數運算子在模數無法整除隨機輸出範圍時會引入偏差,而 $RANDOM 本身是一個 15 位元的產生器,不應該用於任何重要用途。Python 是進行更嚴謹抽取時最常見的替代方案:
python -c "import random; print(random.randint(1, 100))"
此指令會呼叫標準函式庫中的 Mersenne Twister 實作,該實作速度很快,並在你設定種子時具備可重現性,但它同樣不是密碼學上安全的產生器。對於敏感用途,Python 的 secrets 模組才是合適的選擇:
python -c "import secrets; print(secrets.SystemRandom().randint(1, 100))"
Node、PowerShell、awk,甚至透過管線傳遞給 od 的 /dev/urandom,都提供了相同概念的變體。它們共同的優勢在於可腳本化——每個指令都能嵌入 cron job、Makefile 目標或 CI 步驟——以及可重現性,因為這些工具大多接受明確的種子,或每次執行都依賴相同的系統熵。若需要更完整的 Python 重點教學,請參閱如何用 Python 產生隨機數字(無需寫程式)指南。
線上數字挑選器的實際運作方式
線上數字挑選器基本上就是一個帶有兩個輸入欄位和一個按鈕的網頁。使用者輸入最小值、輸入最大值、視需要選擇數量,然後讀回結果。使用者看到的行為與一行 shell 指令相似,但實作路徑會在兩個重要方向上分歧:隨機抽樣不是在使用者瀏覽器中使用 JavaScript 執行,就是由網頁在幕後呼叫的伺服器執行。
第一種作法確實是在本機執行。以使用Lizely 的隨機數字產生器為例,這類瀏覽器型的產生器會從 W3C Web Crypto 介面取得隨機位元,並在網頁內部完成範圍對應。範圍界限與產生的數字從不經由網路傳輸,這代表沒有伺服器端記錄保留生成內容、不需要將結果綁定到任何帳號,也不必信任遠端服務會誠實地呈現其隨機性。
第二種作法——伺服器端——是多數一般「隨機數字」網站採取的方式。表單送出後,伺服器挑選一個數字,再把回應渲染出來。這種模式對營運者很方便(他們可以記錄抽取過程、儲存種子,或將結果附加到使用者帳號),但它徹底改變了隱私情況:範圍、結果、IP 位址和時間戳記,對服務的營運者而言全都一覽無遺。在課堂使用、抽獎或快速決策時,這或許無關緊要;但在任何敏感用途上,則並非如此。
命令列與線上:並列比較
| 面向 | 命令列挑選器(shuf、$RANDOM、Python) | 瀏覽器型線上挑選器 |
|---|---|---|
| 設定成本 | 在大多數 Linux 與 macOS 系統上不需設定;Python 需要直譯器 | 不需設定——只需要瀏覽器 |
| 所需技能 | 熟悉 shell 及相關語法 | 輸入兩個數字並點擊按鈕 |
| 可重現性 | 可透過設定明確種子(Python)或儲存指令來達成 | 有限——大多數頁面並未公開種子 |
| 可腳本化/可嵌入 | 是——可融入任何管線或 cron job | 否——結果必須手動複製出來 |
| 隨機來源 | 系統熵(/dev/urandom)或函式庫 RNG | 瀏覽器 Web Crypto,或若非本機則為遠端伺服器 |
| 範圍與結果的隱私 | 保留在主機上,除非輸出被記錄或上傳 | 視情況而定:在瀏覽器內計算則為本機,否則會送到伺服器 |
| 範圍限制 | 受限於工具——shuf 可處理數十億,$RANDOM 上限為 32767 | 通常限制在安全整數範圍內,且每次呼叫最多 1,000 個結果 |
| 最適用於 | 自動化、批次作業、可重現的實驗 | 單次抽取、非技術使用者、課堂使用 |
最常決定該如何選擇的面向是設定成本、誰會實際執行這次抽取,以及結果是否需要在日後重現。如果最後一個問題的答案是肯定的,那麼使用帶有明確種子的命令列工具,幾乎總是比無法公開種子的瀏覽器頁面更易於為其結果辯護。
如何使用隨機數字產生器在線上挑選範圍
- 在瀏覽器中開啟隨機數字產生器,並在最小值欄位中輸入允許的最小整數。
- 在最大值欄位中輸入允許的最大整數。兩個端點都是可能的結果,因此 1 到 10 的範圍能與中間任何數字一樣輕易地產生 1 或 10。允許負數邊界,且單一值的範圍必定回傳該值。
- 選擇你想要的整數數量,從 1 到 1,000,並決定是否允許重複。在獨立抽取時請保留允許重複——這對於重複模擬或先前結果仍應保有資格的活動很有用。當你需要相異的位置、識別碼或編號過的參與者時,請關閉重複。
- 選擇「產生數字」。頁面會從瀏覽器的 Web Crypto 介面取得隨機位元,並使用拒絕抽樣(rejection sampling)對應到你的包含端點範圍,因此範圍內每個整數擁有相同數量的可能接受原始值。
- 檢視以逗號分隔的輸出。若所要求的唯一值數量超過範圍大小,頁面會回報此要求不可能執行,而不是無限期重試或默默回傳較少的數字。
- 選取並複製結果清單。更動任何輸入會清除先前的清單,因此舊的結果不會被誤認為是由新設定所產生。
一個實際範例:在邊界為 1 與 100、數量為 4 且關閉重複的情況下,產生器會從 1 到 100 回傳四個相異的整數,例如 17, 42, 88, 5。在開啟重複的情況下,同樣的邊界與數量會產生四個來自相同範圍的獨立整數,其中可能包含重複,例如 17, 42, 17, 5。每次執行的確切數字都會改變;不會改變的是,每個被接受的原始值對應到包含端點範圍內任一整數的機率相同。
命令列是較佳選擇的情境
只要抽取作業必須嵌入更大的工作流程,命令列就是首選。每晚從資料庫中挑選五列進行審查的 cron job、隨機排序測試固定資料(fixtures)的 Makefile 目標,或是每次提交時使用新種子對輸入檔進行模糊測試的 CI 管線——這些都比在網頁上點擊來得更易於用一行腳本表達。可重現性是科學與工程工作中的決定性因素:Python 的 random.seed(42) 搭配 random.randint(...) 會在每次執行時產生相同的整數,而這樣的特性正是讓實驗可被稽核的關鍵。一個不公開其種子的瀏覽器頁面無法提供相同的保證。
命令列挑選器也能處理超出瀏覽器所能精確表示的範圍。shuf -i 1-1000000000 -n 1 在任何現代系統上都能運作;以 JavaScript 為基礎的頁面則受限於安全整數範圍,其上限為 9,007,199,254,740,991。對於密碼學或稽核需求來說,shell 工具與瀏覽器頁面單獨使用皆不足——但 shell 能搭配 openssl rand 或 getrandom(2),而瀏覽器頁面無法使用這些底機制。
線上數字挑選器是較佳選擇的情境
線上數字挑選器移除了使用者與結果之間的所有障礙。進行課堂抽選的老師、從帽子裡抽出家事項目的家長,或挑選贈獎活動得獎者的小型企業主,都不需要 shell、直譯器或腳本——他們只需要一個數字。對這些一次性情況而言,最合適的工具就是操作者在壓力下仍能不出錯地執行的那個。
當需要該數字的人與日後將驗證該數字的人並非同一人時,瀏覽器型產生器也很有用。例如一個挑選票券得獎者的志工委員會,可以各自在自己的裝置上使用同一個頁面、看到相同的包含端點行為,並把結果複製到共用文件中。其可重現性比不上一個有種子的腳本,但稽核性比口頭協議更強,因為工具的行為——邊界、數量、是否允許重複——都會顯示在表單欄位中。
隱私是第二個軸線。一個本機瀏覽器工具,例如隨機數字產生器,不會將邊界或結果送到伺服器,因此沒有可調閱的紀錄,也不必信任第三方。命令列工具預設上具備相同的特性——除非你將數字管線輸出到其他地方,否則它不會離開主機——但基於伺服器的線上挑選器則不然。
公平性、隱私與稽核軌跡
這兩種方式都取決於底層隨機來源的品質。Linux 上的 shuf 會讀取 /dev/urandom,這適合一般抽樣,但並非金鑰產生所用的正確基本元件。Python 的 random 模組使用 Mersenne Twister,雖然快速且統計特性良好,但只要觀測到足夠的輸出就能預測。$RANDOM 是 15 位元的線性同餘產生器,無法通過基本的統計檢測,不應在草稿工作以外的場合使用。相較之下,瀏覽器的 Web Crypto 介面被記載為密碼學上強健的來源(請參閱 MDN 對 Crypto.getRandomValues 的參考說明),而一個實作良好的網頁若搭配拒絕取樣法(rejection sampling)使用它,就能將這些位元對應到含上下界的範圍中,而不會產生模偏差(modulo bias)。
對於受規範管理的抽獎、博弈、存取控制、密碼產生,或任何其他具重大影響力的決策而言,沒有任何通用的線上或命令列工具是合適的。這個亂數產生器(Random Number Generator)和 shuf 以及 Python 的 random 一樣,執行時不會留下經簽署的稽核軌跡、外部的隨機性信標(randomness beacon),或可重現的記錄——訪客之後無法證明是哪個瀏覽器的熵產生了某一組特定清單。針對這類決策,請遵循貴單位所要求的規則與經獨立稽核的程序,其中通常涉及有見證人在場的抽籤、多重獨立的熵來源,以及一份經簽署的紀錄。
對於日常任務——課堂活動、抽籤、隨機化的測試資料、順序選擇、遊戲設定,以及需要不可預測整數的一般決策——命令列與瀏覽器型的工具都已足夠。關鍵的問題是:誰將執行這次抽籤、結果是否之後必須能重現,以及範圍或結果是否能離開這部裝置。當最後一個問題的答案是「否」時,本地端的瀏覽器工具就是最乾淨的選擇。
如需深入瞭解,請參閱 LED 跑馬燈批量準備:無需 App 也能製作單行橫幅。