日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

随机数排列JAVA_随机数生成器,按排序顺序

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机数排列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_随机数生成器,按排序顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。