Random和RandomGenerator之间的区别

Asa*_*s77 1 java random class

该项目的主要类是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;
Run Code Online (Sandbox Code Playgroud)

哪里dxdy分别是球水平和veritcal速度.

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

import acm.util.RandomGenerator;

然后

RandomGenerator rgen = RandomGenerator.getInstance();
boolean bool = rgen.nextBoolean();
Run Code Online (Sandbox Code Playgroud)

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

eri*_*son 5

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

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

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

  • @dckuehn大多数时钟都有一个有限的分辨率,因此很容易在"相同"时间创建多个发生器.目前,`java.util.Random`将(高分辨率)时间与全局MLCG输出结合起来,使得种子的重复在天文学上是不可能的.早期版本只使用低分辨率时间,并遇到了"RandomGenerator"文档中描述的相同问题.但是,加密RNG不应该使用时间; 他们应该使用系统的熵收集设备,这可能是一个量子力学过程,或从系统活动的时间收集. (2认同)