正确生成随机数

时间:2014-12-02 15:06:37

标签: java random

我想为我处理的每个对象提供5个随机数。我处理许多对象(单独)并且需要确保在所有数字中实现随机性。如果我处理5个对象,我将有25个随机数:

         RN1 RN2 RN3 RN4 RN5
Object 1   1   2   3   4   5
Object 2   6   7   8   9  10
Object 3  11  12  13  14  15
Object 4  16  17  18  19  20
Object 5  21  22  23  24  25

问题是:

  • 对于单个对象,如果我使用当前时间(以毫秒为单位)作为种子创建随机数生成器,或者当我创建一个随机数生成器并使用nextDouble来获取一系列数字时,它会有所不同吗?随机性质量?
  • 一旦我处理了多个对象并且我取了所有对象的所有第一个随机数,这些是否会形成均匀的随机分布(例如数字1,6,11,16,21)或者这会以某种方式被破坏?

我的观点是,最好只创建一个随机数生成器(由所有对象共享),这样每当需要新的随机数时,我可以调用nextDouble()并按随机数序列获得下一个数字。

3 个答案:

答案 0 :(得分:3)

查看Java中的ThreadLocalRandom类。

它提供了统一的分发并避免了瓶颈,因为每个线程都有自己的副本。

关于他们有不同的序列,它都是关于改变他们的种子。在这种情况下,一种常见的做法是使用Thread / Task / Process的标识符查看生成器。

答案 1 :(得分:1)

  

•对于单个对象,如果我随机创建它会有所不同   使用当前时间输入每个数字的数字生成器   毫秒作为种子或当我创建一个随机数生成器和   在随机性质量方面使用nextDouble得到一系列数字?

不要将当前时间用作每个数字的种子。生成所花费的时间少于当前时间的分辨率(以毫秒为单位)。

答案 2 :(得分:1)

最安全的方法可能是初步生成所需数量的随机数,将其保存到数组中,并建立访问顺序规则。通过这种方式,您可以完全控制该过程。也没有“失去随机性”。

否则,如果一次启动多个生成器,它们很可能会以相同的值(默认为系统时间)播种,如果您使用由不同线程同时访问的单个生成器,则需要传递{的对象{1}}类,这可能是好的,但也可能导致重复性的损失(我不确定,如果这对你的情况至关重要)。