簡體   English   中英

如何生成“隨機”數和“唯一”數?

[英]How to generate “random” but also “unique” numbers?

如何生成隨機數? Java之類的語言如何生成隨機數,尤其是對於GUID如何完成? 我發現像Pseudorandomnumber生成器這樣的算法使用初始值。

但是我需要創建一個隨機數程序,在該程序中,即使系統重新啟動等,一旦出現數字就永遠不會重復。我認為我需要將值存儲在任何地方,以便我可以檢查數字是否重復,但是當列表超出限制時,它將太復雜。

第一:如果保證數字永遠不會重復,那么它不是很隨機。

第二: PRNG算法很多。

更新:

第三:存在用於UUIDIETF RFC (MS稱為GUID),但是如果您擔心,那么(U | G)UID 並不是加密安全的。

更新2:

如果您想在生產代碼中實際使用這樣的內容(不僅用於您自己的教育), 使用預先存在的庫。 如果您以前從未(或者即使有)從未做過這種代碼,那么幾乎可以保證其中包含細微的錯誤。

更新3:

這是.NET GUID文檔

有很多方法可以生成隨機數。 通常,這是通過系統/庫調用來完成的,該調用使用了帶有種子的偽數字生成器,正如您已經描述過的。

但是,還有其他獲取隨機數的方法,其中涉及專門的硬件以獲取TRUE隨機數。 我知道一些使用這種硬件的撲克網站 閱讀他們的操作方式非常有趣。

大多數隨機數生成器都有一種方法可以“隨機”地重新初始化種子值。 (有時稱為隨機化)。

如果那不可能,您還可以使用系統時鍾來初始化種子。

您可以使用以下代碼示例: http : //xkcd.com/221/或者,您可以使用本書: http : //www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477

但是,嚴重的是,不要自己實現它,而要使用現有的庫。 您不能成為第一個這樣做的人。

特別針對Java:

  • java.util.Random使用線性同余生成器 ,這不是很好
  • java.util.UUID#randomUUID()使用java.security.SecureRandom ,這是用於各種加密安全RNG的接口-我相信默認值基於SHA-1。
  • UUID / GUID不一定是隨機的
  • 在網上可以輕松找到比java.util.Random更好的RNG實現,例如Mersenne Twister或帶乘數

我了解您正在尋找一種使用C#生成隨機數的方法。 如果是,則尋找RNGCryptoServiceProvider

[編輯]

如果使用RNGCryptoServiceProvider生成相當長的字節數,則它可能是唯一的,但沒有保證。 從理論上講,真正的隨機數並不意味着唯一。 你擲骰子2次,兩次都可能得頭,但它們仍然是隨機的。 真正的隨機!

我猜想應用唯一性檢查,您只需推出自己的機制即可保留先前生成的數字的歷史記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM