Random
在 Java中使用类的首选方法是什么?
a) 创建一个对象Random
并多次使用
Random
b)每次需要随机值时创建一个新对象
有什么缺点和好处?
从技术上讲,类所做的保证是单个实例将产生伪随机值流。使用您的方法 (b),无法明确保证生成的值流将满足相同的随机性统计定义。因此,如果您关心真正的统计随机性,(a)将是首选。
我认为(b)没有多大好处。我想这意味着您不需要保留对 Random 的单个实例的引用,但是在单例类中这样做会很简单。一般来说,出于性能原因,我会对创建大量新对象持谨慎态度,但您可以衡量影响并决定它是否可以接受。
因此,在这些选项之间,我通常更喜欢 (a)。
我可以看到第三种选择,即使用多个长寿命实例。如果您有多个线程并且希望每个线程使用自己的Random
对象,则可以这样做。(从 javadoc 中我不清楚让多个线程调用单个对象的含义可能是什么。)
如果您需要在循环中重复生成随机数,那么您可以创建一个Random
对象并使用它来生成数字。几乎没有任何理由Random
为每个随机数创建一个新对象。这样做可能会不必要地降低程序的性能。
如果您偶尔生成一次随机数,那么每次生成随机数时创建一个新的 Random 对象并没有什么坏处。随身携带一个Random
物体也可以。请注意,这可能与上述情况混合在一起:例如,您可能会在游戏开始时生成许多随机数,但在游戏期间不会发生随机事件。
Random
对于 Java 虚拟机,我对通过在程序的整个生命周期中不保留对象可以节省的内存使用量有点怀疑。另一方面,如果Random
总是重新创建对象,肯定会影响性能。开销可能可见也可能不可见,具体取决于程序的功能。
这里的其他答案很好。尤其是戴夫·科斯塔的那个。我只有一件事要补充。
您希望谁看到随机行为?程序员还是最终用户?
使用带有静态种子的 1 个随机对象,意味着您将始终能够执行相同的操作并获得相同的结果(随机是伪随机而不是实际随机)。这是调试和尝试重现报告的错误的奇迹!