2012-08-02 61 views
4

在Java中使用Random类的首选方式是什么?使用随机类的首选方法

a)创建一个对象的Random并使用了很多次

二)创建的Random一个新的对象每次需要一个随机值

哪些缺点和beneftis时间?

+1

如果你选择一个,那么你有一些内存开销。如果你选择b,那么你有性能开销。在这两种情况下,开销都取决于你做什么,可能是微不足道的或重要的。 – nhahtdh 2012-08-02 18:01:07

+0

如果您担心数字的“随机性”,那么您可以重新设置“Random”对象 - 这比创建一个全新的对象简单得多。 'myRandom.setSeed(System.currentTimeMillis());' – Jamie 2012-08-02 18:19:44

+0

@Jamie这实际上是一个坏主意。因为没有明确的保证,结果的值流将满足randomness_的统一定义。请参阅戴夫科斯塔斯回答 – Stefan 2012-08-02 18:22:12

回答

5

从技术上讲,类的保证是单个实例将产生一个伪随机值的值流。用你的方法(b),没有明确的保证,结果的值流将满足统一的随机性定义。所以如果你关心真正的统计随机性,(a)将是首选。 (b)我看不到太多好处。我想这意味着你不需要保持对Random的单个实例的引用,但是在单例类中这样做会很简单。一般来说,由于性能原因,我会对创建大量新对象保持警惕,但是您可以测量影响并确定它是否可以接受。

所以在这些选项之间,我通常更喜欢(a)。

我可以看到使用多个长寿命实例的第三个选项。如果您有多个线程并且您希望每个线程都使用它自己的Random对象,则可以这样做。 (这是我不清楚从javadoc的是什么含义是具有多个线程调用一个对象可能的。)

+2

Quote:“没有明确保证所产生的价值流将满足随机性相同的统计定义”。使用相同的种子时尤其如此。 :)(发生在我身上的一次......) – Stefan 2012-08-02 18:20:29

3

如果您需要在反复生成随机数,那么你可以创建一个Random对象,用它来生成数字。几乎没有任何理由为每个随机数创建一个新的Random对象。否则可能会不必要地降低程序的性能。

如果您偶尔生成一些随机数,那么每次生成随机数时都不会产生新的Random对象。保持Random对象也是可以的。请注意,这可能与上面的情况混合:例如,您可能会在游戏开始时生成很多随机数,但在游戏过程中不会发生随机事件。

对于Java虚拟机,我有点怀疑可以通过在程序的整个生命周期中不保留Random对象来节省内存使用。另一方面,如果总是重新创建对象Random,那么性能肯定会受到影响。开销可能会或可能不可见,具体取决于程序的功能。

1

这里的其他答案是很好的。特别是来自Dave Costa的。我只需要添加一件事。

你想看到随机行为?程序员还是最终用户?

使用1带有静态种子的随机对象意味着您将始终可以执行相同的操作并获得相同的结果(随机数是随机的,而不是随机的)。这是一个奇迹,用于调试并尝试重现报告的错误!