Java游戏中Random()实例的持久性?

时间:2012-06-26 03:19:05

标签: java random persistence

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

-

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

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

-

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

谢谢!

1 个答案:

答案 0 :(得分:5)

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

除了一些例外:

  1. 模式的可预测性是。例如,种子特定的“纸牌游戏数”或“确保发生相同的随机事件”(例如停止保存/加载“作弊”;-)可能需要额外的工作来利用PRNG可重复性,因为内部状态不是裸露。这是业务规则
  2. 使用线程, 使用相同的Random实例时出现性能问题。 (随机是Java中的线程安全,我之前想念。)
  3. 相同种子的问题是PRNG序列将开始相同(因此是已知的,或者通常更常见的是,导致相同的[碰撞]序列和“缺乏随机性”)。然而,序列的随机性质量不受影响。

    顺便说一句:谢天谢地,Java有一个相当不错的默认的Random构造函数:

      

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

    在JDK 6中,它实现为:

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

    (当然,也可以通过以上实现来设想/设计退化场景......)

    快乐的编码。