2

当为两个完全独立的机制(例如攻击掷骰和表面随机动画)获取 Random().nextInt(int) 整数时,是否有任何理由为每个机制使用单独的 Random() 实例?例如,它是否有助于确保每个机制的随机值分布更均匀?

-

同样,在随机值的均匀分散很重要的持续游戏中,是否有任何理由将 Random() 的实例或种子与保存的游戏数据一起存储 - 并在游戏加载时从中断处继续 - - 而不是每次都创建一个新实例?

例如,在一个回合制游戏中,玩家每回合可能幸运或不幸,是否有可能在游戏加载时创建一个新的 Random() 实例可能会导致玩家异常幸运或不幸的情况?

-

(注意:当我说“创建一个新实例”时,我的意思是只使用“Random random = new Random()”,没有指定种子。)

谢谢!

4

1 回答 1

5

不,没有理由。使用相同的实例。

除了一些例外:

  1. 期望模式可预测性。例如,播种特定的“纸牌游戏编号”或“确保发生相同的随机事件”(例如停止保存/加载“作弊”;-) 可能需要额外的工作来利用 PRNG 可重复性,因为内部状态不是裸露。这是一条商业规则
  2. 使用了线程,使用相同的 Random 实例存在性能问题。(随机在 Java 中是线程安全的,我之前说错了。)

相同种子的问题是 PRNG 序列将开始相同(因此是已知的,或者通常更常见的是,导致相同的 [冲突] 序列和“缺乏随机性”)。然而,序列随机性的质量不受影响。

顺便说一句:幸运的是,Java 有一个非常好的默认 Random 构造函数:

创建一个新的随机数生成器。此构造函数将随机数生成器的种子设置为一个很可能与此构造函数的任何其他调用不同的值。

在 JDK 6 中,它被实现为:

this(++seedUniquifier + System.nanoTime());

(当然,也可以用上述实现来想象/设计一个退化的场景......)

快乐编码。

于 2012-06-26T03:23:29.260 回答