关于提供long
播种java.util.Random
,如果我实例化该对象一次,似乎如果我只是将时间作为种子,这对于程序的生命周期来说是令人满意的,这对于我的目的来说意味着一系列调用的结果nextDouble()
看起来随机。
假设出于代码简单的原因,我实例化Random
,使用几次,然后重新实例化,如此重复。如果提供类似的种子,种子将会相似并且会增加,因为它是基于时间的。如果是自 1970 年 1 月 1 日以来的秒数,则与该值相比,增量会很小。(编辑:这个问题是在 2011 年提出的。)
如果我链接输出nextDouble()
是否重新实例化Random
使用非随机的基于时间的种子会导致在输出的复合链中出现微妙的模式nextDouble()
。表达这个问题的另一种方式是:我需要从集合中统一抽取种子吗?long
.
您可能会遇到这样的情况,它们确实会被分配相同的种子,特别是如果它们是在同一毫秒内创建的。有些机器的分辨率低至 15 毫秒或更高,因此这成为一个更大的问题。
解决这个问题的一种方法是使用Math.random()
。它使用系统范围的随机实例,仅在第一次使用时才会实例化。我不相信您有权访问底层实例,因此您不能使用它来获取nextInt()
但你可以使用Math.random()
对于双打,或者如果您确实想要自己的 Random 对象,请获取double
from Math.random()
,将其位转换为long
并使用它long
作为你的新种子Random
.
可以找到随机的 Oracle 文档here.
// create new random with seed from system random
Random r = new Random(Double.doubleToLongBits(Math.random()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)