這個問題在這里已經有了答案: O(1) 中的唯一(非重復)亂數? (22 個回答) 3 天前關閉。
假設我的系統需要定期提供一個唯一的整數 id,介于 1 到 10^20 之間,來自這樣的函式——
function getNextRandomUniqueId(index:BigInt, min:BigInt, max:BigInt, seed:BigInt): BigInt { ? }
id = getNextRandomUniqueId(index=42, min=1, max=10^20, seed=0)
這些 id 需要隨著索引的增加以隨機順序提供,而不是按順序提供。一旦提供了 id,就不能再次提供,只要索引增加。我的系統無法存盤所有要發行的號碼的隨機串列,或者所有發行的號碼,太多了。我也不想依賴像隨機 UUID 這樣的東西,它極不可能發生碰撞,但不能保證。
如何才能做到這一點?有一種確定性的數學方法來隨機迭代一組連續的整數而無需重復和存盤?
編輯:固定 1^20 到 10^20
uj5u.com熱心網友回復:
假設您可以存盤加密密鑰和計數器,則可以這樣做。加密是一對一的映射,因此通過加密給定范圍內的所有數字,您將按隨機順序取回所有相同的數字。不同的鍵會給出不同的順序。按順序加密數字 0, 1, 2, 3, ...,使用密鑰并跟蹤您已經獲得了多遠。
根據數字的范圍,您可能需要使用某種形式的格式保留加密來將輸出保持在所需的范圍內。
uj5u.com熱心網友回復:
您不能保證您的相同 ID 不在另一個種子序列中。
當您自己不提供種子時,大多數語言都會使用時間來生成序列。您已將種子設定為零,因此每次重新啟動程式時,您都將獲得相同的 ID。這很可能不是您的意圖:-)
但即使你會這樣做,你也有可能遇到相同的 id。100,000,000,000,000,000,000 中的 1。
你能得到相同id的原因是因為它是RANDOM
我會用一個 GUID。1 在 340.280.000.000.000.000.000.000.000.000.000.000.000
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359133.html
上一篇:排列演算法的復雜度分析
下一篇:Java:理解單向鏈表的實作
