[英]How to generate “random” but also “unique” numbers?
如何生成隨機數? Java之類的語言如何生成隨機數,尤其是對於GUID如何完成? 我發現像Pseudorandomnumber生成器這樣的算法使用初始值。
但是我需要創建一個隨機數程序,在該程序中,即使系統重新啟動等,一旦出現數字就永遠不會重復。我認為我需要將值存儲在任何地方,以便我可以檢查數字是否重復,但是當列表超出限制時,它將太復雜。
有很多方法可以生成隨機數。 通常,這是通過系統/庫調用來完成的,該調用使用了帶有種子的偽數字生成器,正如您已經描述過的。
但是,還有其他獲取隨機數的方法,其中涉及專門的硬件以獲取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。 java.util.Random
更好的RNG實現,例如Mersenne Twister或帶乘數 我了解您正在尋找一種使用C#生成隨機數的方法。 如果是,則尋找RNGCryptoServiceProvider 。
[編輯]
如果使用RNGCryptoServiceProvider生成相當長的字節數,則它可能是唯一的,但沒有保證。 從理論上講,真正的隨機數並不意味着唯一。 你擲骰子2次,兩次都可能得頭,但它們仍然是隨機的。 真正的隨機!
我猜想應用唯一性檢查,您只需推出自己的機制即可保留先前生成的數字的歷史記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.