该项目的主要类别是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类时不需要一个。

最佳答案

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

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

通常,最好使用java.util.Random,因为它不会在程序中引入第三方依赖性,并且会使用更好的播种算法,而不会受到ACM实现的缺陷的影响。

09-13 06:24