gpt4 book ai didi

java - 在Java中快速有效地生成随机数的方法

转载 作者:行者123 更新时间:2023-12-02 03:09:07 26 4
gpt4 key购买 nike

我正在编写一个多线程 Java 程序,它会生成大量随机数。

其他详细信息:这些数字用于创建 0-99 范围内的随机数字列表,不重复,并且列表中存在 0-99 范围内的每个数字(换句话说,该列表包含 0-99 范围内的 100 个唯一元素) .

生成随机数[已经尝试过了!]

  1. 我有一个 ArrayList,其中包含从 0 到 100 的数字。我生成一个随机数并将其用作索引,用于从 ArrayList 中弹出一个元素。
  2. 我使用了Collections.shuffle()

这是方法 1 的代码:

ArrayList<Integer> arr = new ArrayList<Integer>(); 
for (int i = 0; i < N; i++){
arr.add(i, i);
}

for(int i=0; i<N; i++){
int indx = rand.nextInt(arr.size());
res.add(arr.get(indx));
arr.remove(indx);
}

对于第二种方法,我用 Collections.shuffle(arr) 替换了第二个 for 循环。

由于生成随机数列表是我的算法中最昂贵的部分,因此我想对其进行优化。这让我想到了以下问题:

  1. 生成随机数的最快方法是什么?
  2. 生成上述随机数列表的最快方法是什么?

PS:

  1. 我发现 Collections.shuffle() 比第一种方法慢
  2. 有人建议我使用 rngd 在 Unix 中从硬件生成随机数。以前有人尝试过这个吗?你是怎么做到的?

最佳答案

我认为Collections.shuffle()有问题就是使用默认 Random实例是线程安全的单例。你说你的程序是多线程的,所以我可以想象Random中的同步是一个瓶颈。

如果您乐意在 Java 7 上运行,只需使用 ThreadLocalRandom 。仔细一看,有一个版本shuffle()显式获取随机实例:

Collections.shuffle(arr, threadLocalRandom);

其中threadLocalRandom仅创建一次。

在 Java 6 上,您只需为每个线程创建一个 Random 实例即可。请注意,您不应在每次运行时创建一个新的 Random 实例,除非您每次都可以提供随机种子。

关于java - 在Java中快速有效地生成随机数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com