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