随机数排列JAVA_随机数生成器,按排序顺序
我需要一個生成器,用于許多(最多一萬億,10 ^ 12)個獨特的隨機64位數字。
生成器需要按排序順序返回數字(Long.MIN_VALUE為Long.MAX_VALUE)。問題是排序$ 10 ^ {12} $ number的速度很慢。該用例正在復制為BBHash運行的測試(在paper中,4.5索引一萬億個密鑰)。
直接的解決方案是在內存中創建一個集合,使用大量的集合
確保不會返回重復項。
但是這會占用太多內存或I / O.
我想最多使用幾MB內部狀態。
生成器應該在內部使用java.util.Random。
它應該是"公平"盡可能(具有相同的統計分布,如果否則生成)。我還希望有一個128位數字版本(2長)。
到目前為止我所擁有的是在內存中創建一個集合的代碼(Java代碼):
public static void main(String... args) {
for(long x : randomSet(10, 0)) {
System.out.println(x);
}
}
static Iterable randomSet(int size, int seed) {
Random r = new Random(seed);
TreeSet set = new TreeSet();
while (set.size() < size) {
set.add(r.nextLong());
}
return set;
}
-8292973307042192125
-7423979211207825555
-6688467811848818630
-4962768465676381896
-2228689144322150137
-1083761183081836303
-279624296851435688
4437113781045784766
6146794652083548235
7105486291024734541
最簡單(錯誤)的解決方案是非隨機的,是均勻分配結果。
我不認為解決方案會隨著時間的推移添加一個隨機的差距&#34;將工作,
因為它很慢,10 ^ 12之后這些間隙的總和不會降落到它應該的位置(好吧,也許:記住剩下多少個數,然后重新計算分布......)。我認為以下內容應該有效,但是很復雜,并且不確定要使用哪些公式:對于每個位級別,
遞歸地,計算可能發生多少0/1
(以某種方式使用二項分布或近似,正態/高斯分布)。
在某些時候停止(例如,100萬條或更少的區塊),
使用上面的代碼,以獲得速度。
但也許有一個優雅的解決方案。
也許這與Metropolis-Hastings算法有關,不確定。
我讀了&#34;一種有效的順序隨機抽樣算法&#34;,
但我認為這只適用于小n,我發現很難從中獲得一個簡單的算法。
Java代碼是最好的,但C很好(無論如何,我可能必須將其轉換為C / C ++)。我想不要使用太多的庫來簡化移植。
總結
以上是生活随笔為你收集整理的随机数排列JAVA_随机数生成器,按排序顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fpga电平约束有什么作用_FPGA时序
- 下一篇: java多态调用优先级_关于java的多