Command Palette

Search for a command to run...

如何在線上產生隨機數:範圍、唯一集合以及隨機性何時真正重要

如何在線上產生隨機數:範圍、唯一集合以及隨機性何時真正重要

T
Toolz Team
|Aug 23, 2026|15 閱讀

發電機 合集的一部分

第一次隨機數咬我是在 Laravel 的業餘專案中,幾年前我開始建立 toolz。dev。我需要簡短的推薦代碼,已達到 rand() 因為它就在那裡,然後發貨了。一週後,兩個用戶有了相同的代碼。不是因為可能性是天文數字,而是因為我誤解了什麼 rand() 實際上答應了。那個小小的尷尬給了我一個教訓,我已經把這個教訓帶入了 toolz。dev 上的每個工具中:"隨機&引用;不是一回事。有一種隨意的隨機性對於擲骰子來說很好,當價值守護任何東西時,你需要一種嚴肅的隨機性。

本指南是我希望當時有人告訴我的內容的長版本。我將介紹如何使用 產生隨機數 隨機數產生器 在 toolz。dev 上,當唯一唯一集很重要時,為什麼隨機性來源會改變您可以安全地使用輸出的用途,以及我在建置時達到它的實際情況。

TL;DR: 隨機數產生器從您定義的範圍內抽取值。設定最小值和最大值,選擇您想要的數字,然後選擇整數或小數。僅在沒有值可以重複時才開啟唯一值,這就是您想要的彩票、抽獎和採樣而無需替換。 toolz。dev 產生器完全在您的瀏覽器中運行,並且更喜歡 Web Crypto API,因為它具有隨機性,因此您產生的任何內容都不會離開您的裝置。

隨機數產生器實際上有什麼作用?

隨機數產生器將不可預測的位元來源對應到一個範圍內。這就是整個工作。在瀏覽器中,重要的來源是 crypto.getRandomValues(),web 加密 API 要求加密能力強 - 不同 Math.random(),這並沒有做出這樣的承諾。你告訴它間隔,例如 1 到 100,它從該間隔內返回一個值,理想情況下,每個值都有相同的出現機會。要求多個,它會重複抽獎。

有趣的是單字"不可預測,"因為電腦是確定性機器,不會自然地產生驚喜。它們產生的是偽隨機性:一個看起來隨機並通過統計測試的序列,但是由起始種子的演算法生成的。給相同的演算法相同的種子,每次都會得到相同的序列。當您編寫需要可重複的測試時,再現性是一個特徵,而當您鑄造必須無法猜測的東西時,再現性是一個責任。

在 toolz。dev 上,產生器位於瀏覽器中並從中讀取其位元 crypto.getRandomValues 當瀏覽器暴露它時,每個現代瀏覽器都會這樣做。該功能由 W3C Web 加密 API 定義,並由作業系統 #39 支援;加密安全來源。當該來源存在時,這些數字足夠不可預測,可以進行與安全相關的工作,例如選擇令牌或洗牌。當它以某種方式不可用時,該工具會回到標準 JavaScript 生成器,這對於遊戲和採樣來說很好,但永遠不應該播種任何秘密。了解您所處的這兩個世界中的哪一個是使用任何 RNG 井的最重要的事情。

如何在 toolz。dev 上產生隨機數?

流程故意很短,因為大多數時候您只是想要一個數字,而現在就想要它。

首先,設定範圍。輸入最小值和最大值。對於整數,範圍兩端都包含,因此 1 到 6 可以傳回 1、2、3、4、5 或 6 中的任意一個,就像骰子一樣。負值和跨度為零的範圍(例如 -50 到 50)的工作方式相同。

其次,選擇您想要的數字。一個數字用於快速選擇,或者當您播種測試數據或建立樣本時,最多一萬個數字。

第三,選擇選項。離開並引用;僅整數&引用;對於整數,或將其關閉並在需要小數值時設定小數點。開啟並引用;僅唯一值&引用;當沒有數字可以重複時。

最後,點擊生成。結果顯示清單以及總和和平均值,並且整批副本作為換行符分隔的列表,因此它直接放入電子表格列、腳本或測試夾具中。如果您使用過 uuid 生成器 或者 密碼產生器 在 toolz。dev 上,它的形狀會讓人感覺熟悉,因為我嘗試保持生成器的一致性。

我什麼時候應該使用唯一號碼?

這是人們錯過的選擇,也是改變數學最多的選擇。

預設情況下,生成器會進行替換抽取。每次抽獎都是獨立的,因此一個數字可以在同一批次中多次出現。這對於擲骰子來說是正確的,因為一對真正的骰子絕對可以得出兩個四。但對於抽獎、抽獎或您選擇樣品而不將代幣放回袋子中的任何時間來說,這是錯誤的。

僅開啟唯一版本,生成器無需更換即可抽取。它會記錄已生產的產品並跳過重複,直到填滿您的批次。經典用途是彩票號碼:如果您想要 1 到 49 之間的六個號碼,沒有重複,則唯一是有效彩票和損壞彩票之間的區別。

這裡有一個自然的限制,工具尊重它。你不能畫出比範圍所能容納的更多的唯一整數。詢問 1 到 5 之間的 10 個唯一數字,但沒有有效答案,因為在該區間內只存在 5 個不同的整數。生成器不會永遠旋轉試圖找到第六個不可能的值,而是停止並告訴您範圍太小。在看到生產代碼中懸掛了太多簡單的洗牌循環後,我故意建立了這個守衛。

整數或小數:我需要哪一個?

整數涵蓋了大多數請求。骰子、彩票球、數組索引和記錄計數都是整數,整數模式為您提供與人們對這些事物的看法相匹配的包容性範圍。

小數代表連續量:隨機價格、模擬感測器讀數、權重、機率。關閉整數模式,工具從半開區間中抽取,其中包括最小值但不包括最大值。半開約定(包括最小值和排除最大值)與每種語言中幾乎每個浮點 RNG(包括 JavaScript 和#39;自己的 Math.random,它傳回從 0 到 1 的範圍內的值,但不包括 1。符合該約定意味著您在這裡得到的數字的行為與您在程式碼中獲得的數字類似。

您還可以控制小數點的數量,從 1 到 10。對於類似貨幣的值來說,有兩個位置是正確的,當您模擬需要更精細解析度的測量時,更是如此。請記住,唯一唯一加小數幾乎總是可滿足的,因為不同小數的空間很大,而唯一加微小的整數範圍是您撞到上述牆壁的地方。

" 隨機性有多大"?

這是我希望在轉介代碼事件發生之前看到的表格。它將常見用例映射到它們實際需要的隨機性。

用例 需要隨機性 允許重複嗎? 筆記
骰子、棋盤遊戲 偽隨機就好了 是的 每卷的獨立性就是重點
隨機選出獲勝者 優先加密 不(唯一) 公平很重要,只能使用唯一的
彩票或抽獎號碼 優先加密 不(唯一) 無需更換即可抽獎
用於分析的採樣行 偽隨機就好了 通常沒有 獨特 - 僅適用於採樣,無需更換
種子測試裝置 偽隨機就好了 是的 再現性甚至是可取的
安全令牌、秘密 需要加密 切勿在此使用普通的 PRNG

使人絆倒的行是 "安全令牌。"通用 RNG,即使是一個好的 RNG,也不能取代專門建構的秘密產生器。如果您要建立 API 金鑰、會話令牌或密碼,請使用為該作業設計的工具,例如 密碼產生器,或像這樣的雜湊工具 哈希產生器 當您需要固定長度的摘要時。隨機數產生器適用於某個範圍內的數字,而不是加密金鑰材料,並且該邊界的誠實框架比假裝一個工具可以完成所有操作更有用。

我實際上可以用它建造什麼?

這在我的工作流程中贏得一席之地的一些方式。

當我測試渲染清單的 UI 時,我會產生一批數百個數字來代表數量、價格或分數,將它們貼到固定裝置中,突然以逼真的多樣性而不是相同的三個來執行佈局手動排。對於 WP Adminify 上的 WordPress 工作,我使用隨機值來填充演示內容,以便設定畫面在螢幕截圖中看起來栩栩如生。

當客戶端運行贈品時,唯一唯一模式會從編號的參賽者清單中公平地挑選獲勝者。為每個參賽者分配一個號碼,抽出盡可能多的獨特獲勝者,完成。沒有電子表格公式,也沒有關於抽獎是否被操縱的爭論,因為這些號碼來自我們都不控制的來源。

為了快速統計直覺,產生大量並查看總和和平均值是對範圍和分佈表現的快速理智檢查。如果我要求數字從 1 到 100,而平均值回到 50 附近,世界就如預期了。

對於日常用品來說,它是一個擲骰子,當你將 1 和 2 視為正面和反面時,它會翻轉硬幣,以及 "選擇一個數字"小參數的沉澱器。並非每次使用都必須認真才能有用。

這與自己寫相比如何?

你可以寫 Math.floor(Math.random() * (max - min + 1)) + min 並完成。我已經寫過那一千遍了。那為什麼要伸手去拿工具呢?

有兩個原因,兩人都學得很辛苦。第一個是手動滾動範圍數學中出現的逐一錯誤和模偏差錯誤,特別是當你添加包容性與排他性邊界和唯一唯一要求時。該工具處理邊緣情況,包括 "您要求比現有&quot更多的獨特值;案例,所以你不會在凌晨 2 點重新發現它們。第二個是 Math.random MDN 文件明確指出,這一事實在加密上並不安全,而且很容易忘記,當您將片段貼到程式碼中時,稍後會保護真實的東西。 toolz。dev 產生器預設為加密來源,因此您無需考慮即可獲得更安全的行為。

對於您控制的環境中的一次性號碼,片段很好。對於可重複的抽獎、獨特的集合、您想要複製的批次或任何您想要預設加密來源的內容,該工具會保存繁瑣的部分。

如果您的工作更傾向於編碼和格式化而不是數字生成,則相同的客戶端理念將貫穿工具箱的其餘部分 洛雷姆·伊普蘇姆 將佔位符文字產生器傳送到所涵蓋的更廣泛的集合 開發人員生產力工具 引導。而且因為其中每一個都在本地運行,所以 資料隱私 所有這些的故事都是一樣的:您的輸入保留在瀏覽器中。

人們對隨機數常犯什麼錯誤?

經過多年審查程式碼、我的和其他人和#39;同樣的一些錯誤一次又一次地出現,它們值得命名,這樣你就可以避免它們。

第一個是令人困惑的&引用;不太可能&引用;與&引用;不可能。&引用;我的推薦代碼故事正是這樣的。當你從某個範圍進行替換時,碰撞不是一個錯誤,只要有足夠的繪製,它們就是一個統計確定性。生日悖論是一個經典的例子:在只有23 人的群體中,兩個人共享一個生日的幾率超過50%,遠高於直覺所暗示的,因為你正在比較每對,而不是將每個人與一個固定日期進行比較。如果您的值必須是唯一的,請不要希望範圍足夠大。僅開啟唯一並消除疑問。

第二個是找到錯誤的來源。大量教程顯示了基於的範圍公式 Math.random 並且永遠不要提到它不適合任何安全敏感的東西。該值看起來是隨機的,演示有效,並且習慣仍然存在。然後有人將其片段複製到產生密碼重置令牌的程式碼中,現在 "隨機&引用;令牌對於任何了解底層演算法的人來說都是可以預測的。規則很直白:如果人類永遠無法猜測該值,則需要一個加密來源。 toolz。dev 產生器預設為該來源,這是建立習慣的更安全的預設。

第三個是範圍邊界處的一一錯誤。即使經驗豐富的開發人員,包容性與排他性端點也會絆倒,因為不同的語言和不同的函數會做出不同的選擇。當我要求 1 到 100 時,100 是否是可能的輸出?對於這裡的整數,是的,包括兩端。對於小數,最大值被排除,與浮點約定相符。明確應用哪個約定可以防止安靜的錯誤,即您的骰子永遠不會因為您寫了而擲出 6 < max 代替 <= max.

第四個假設一個小樣本看起來是隨機的。真正的隨機性會產生團塊和條紋。將一枚公平的硬幣翻轉十次,連續四個正面是完全正常的,但人們看到它並假設硬幣或生成器壞了。隨機性與均勻間距不同。如果你想要均勻間隔的值,你根本不想要隨機數產生器,你想要一個序列。知道你真正需要哪一個就是一半的戰鬥。

常見問題

隨機數產生器如何運作?

隨機數產生器將不可預測的位元來源對應到您選擇的範圍。當 Web Crypto API 可用時,此工具會從 Web Crypto API 讀取字節,並將它們縮放到最小到最大間隔,因此該範圍內的每個值都有相同的被繪製機會。

這些數字真的是隨機的嗎?

它們是加密強偽隨機數,對於所有實際目的來說都是不可預測的。當瀏覽器公開 crypto。getRandomValues 時,輸出適合令牌和洗牌;如果只有標準產生器可用,則值仍然分佈良好,但不應用於秘密。

如何產生不重複的唯一隨機數?

產生前啟用唯一唯一的選項。然後該工具無需替換即可繪製,因此批次中的每個數字都是不同的。如果您要求比範圍所能容納的更多唯一整數,它會告訴您而不是永遠循環。

它可以產生十進制數嗎?

是的。關閉整數選項並設定您想要的小數點。小數是從半開區間中抽取的,其中包括最小值但不包括最大值,這是連續範圍的標準約定。

我可以使用負數嗎?

是的。輸入負最小值、負最大值或跨度為零的範圍,例如 -50 到 50。產生器處理負值和混合範圍的方式與處理正值相同。

我可以同時產生多少個數字?

每批最多 10,000 個號碼。結果包括總和和平均值,以便您可以一目了然地檢查大批量,整個清單複製為換行符分隔值。

這個隨機數產生器是免費且私有的嗎?

是的。它是免費的,沒有註冊,也沒有使用上限,每個號碼都是在您的瀏覽器中產生的。範圍、計數或結果不會傳輸到伺服器。

我可以使用隨機數產生器做什麼?

常見用途包括挑選彩票或抽獎號碼、擲骰子遊戲、隨機選擇獲勝者、播種測試數據、抽樣行進行分析以及隨機化清單順序。唯一唯一模式涵蓋任何需要採樣而無需重複的情況。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!