【问题标题】:Difference between Random and RandomGeneratorRandom 和 RandomGenerator 之间的区别
【发布时间】:2014-05-15 15:07:21
【问题描述】:

这个项目的主类是acm.program.GraphicsProgram;GraphicsProgram

之前在我的项目上工作时,我需要在 Pong 游戏中稍微随机化球的运动,并通过使用 import java.util.Random; 找到了解决方案,然后我使用了这个代码(每次球从玩家的桨上反弹时执行,这会使球移动每场比赛都不一样):

Random rand = new Random();
            boolean bool = rand.nextBoolean();
            if (bool)
                if (dx > 0)
                    dx += 1;
                else
                    dx -= 1;
            else if (dy > 0)
                    dy += 0.5;
                 else
                    dy -= 0.5;

其中dxdy 分别是球的水平和垂直速度。

但是今天在大学讲座中,我们看到了不同的方法(与第一个无关,我自己认为更早),使用

import acm.util.RandomGenerator;

然后

RandomGenerator rgen = RandomGenerator.getInstance();
boolean bool = rgen.nextBoolean();

这两个类(Random 和 RandomGenerator)有什么区别吗?如果是这样,哪个更好用?我不太明白getInstance(); 是什么以及为什么我在使用Random 类时不需要它。

【问题讨论】:

标签: java class random


【解决方案1】:

ACM RandomGenerator 有一些额外的便利方法,例如 nextColor() 选择随机颜色。

它还通过其getInstance() 类方法提供了一个全局生成器。基于 cmets,听起来构造函数使用当前时间作为种子。这是一个很大的缺陷,可能会导致不同的生成器实例产生相同的随机数序列的错误。为了解决这个问题,他们建议只使用一个RandomGenerator 实例,通过getInstance() 方法访问。

一般来说,最好使用java.util.Random,因为它不会在您的程序中引入第三方依赖项,并且它使用更好的种子算法,不受 ACM 实现缺陷的影响.

【讨论】:

  • 此外,java.util.Random 记录了它正在使用线性同余生成器。无论 ACM 是什么,它都没有在 javadocs 中说明并且可能会改变。
  • 我们可以讨论一下为什么使用时间作为种子是一个缺陷吗?您还可以使用什么作为种子而不可能产生相同的种子?
  • @dckuehn 大多数时钟的分辨率都是有限的,因此很容易在“同一”时间创建多个生成器。目前,java.util.Random 将(高分辨率)时间与全局 MLCG 输出相结合,使得复制种子在天文上是不可能的。早期版本只是使用了低分辨率时间,并遇到了RandomGenerator 文档中描述的相同问题。然而,加密 RNG 不应该使用时间;他们应该使用系统的熵收集设备,这可能是一个量子力学过程,或者是从系统活动的时间中收集的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
  • 2012-08-12
相关资源
最近更新 更多