关于提供long种子java.util.Random,如果我将对象实例化一次,似乎我只是把时间作为一个令人满意的程序生命的种子,这对我来说意味着一系列的结果呼叫nextDouble()看起来随机.
假设代码简单的原因,我实例化Random,使用它几次,然后重新实例化,并重复.如果种子类似地提供,则种子将是相似的并且增加,因为它基于时间.如果它是自1970年1月1日以来的秒数,则增加量将小于该值.(编辑:此问题在2011年被提出.)
如果我链接输出,nextDouble()那么Random使用非随机的基于时间的种子重新实例化会导致一个微妙的模式出现在输出的复合链中nextDouble().另一种表达这个问题的方法是:我是否需要从一组中均匀地绘制种子long.
您可能会遇到这样的情况,确实会为它们分配相同的种子,特别是如果它们是在同一毫秒内创建的.有些机器的分辨率低至15毫秒或更高,因此它成为一个更大的问题.
解决这个问题的一种方法是使用Math.random().它使用一个系统范围的随机实例,它只在第一次使用时才被实例化.我不相信你可以访问底层的实例,所以你不能用它来获得nextInt(),但你可以使用Math.random()的双打,或者,如果你真的想你自己的Random对象,得到了double来自Math.random()其位转换成long和使用那long是你新人的种子Random.
可以在此处找到随机的Oracle文档.
// create new random with seed from system random
Random r = new Random(Double.doubleToLongBits(Math.random()));
Run Code Online (Sandbox Code Playgroud)