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

Sve*_*ing 2 java random persistence

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

-

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

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

-

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

谢谢!

小智 5

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

除了一些例外:

  1. 图案的可预测性期望.例如,种子特定的"纸牌游戏数"或"确保发生相同的随机事件"(例如停止保存/加载"作弊";-)可能需要额外的工作来利用PRNG可重复性,因为内部状态不是裸露.这是一项商业规则.
  2. 线程被使用,并且有使用相同的随机实例的性能问题.(随机是Java中的线程安全,我之前错过了.)

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

顺便说一句:谢天谢地,Java有一个非常好的默认Random构造函数:

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

在JDK 6中,它实现为:

this(++seedUniquifier + System.nanoTime());
Run Code Online (Sandbox Code Playgroud)

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

快乐的编码.