JRE或平台之间的java.util.Random实现是否不同?

Fla*_*ash 5 java random

当我在Eclipse中查看源代码时,该next方法java.util.Random基本上是:

seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (int)(seed >>> (48 - bits));
Run Code Online (Sandbox Code Playgroud)

如何确定不同的JDK或JVM next是以不同的方式实现还是以不同的常量实现?

在播种Java Random时,我已经在奇怪的行为中遇到了不同的无参数构造函数 .我想知道该next方法是否会发生类似的事情.我在哪里可以找到不同实现的来源?

Ste*_*n C 5

Javadoc用于Random.next()明确说明哪个算法用于生成下一个数字.

理论上可能不同的JVM可能使用不同的算法,但这不太可能,特别是如果您将自己限制为基于Sun/Oracle库的JVM.


该文档是否必然适用于所有JDK?

你需要检查以确定,但可能是的.这是Sun/Oracle不太可能改变的事情,因为有可能破坏过去15年左右的大量现有Java应用程序和测试套件.

以下是一些事实:

  • Java 1.3.1到Java 1.7(*)的javadoc包含与此方法完全相同的规范,

  • 如果符合规范,则只允许使用商标"Java"

  • 大多数(如果不是全部)Java(TM)实现使用从Oracle/Sun源代码派生的类库,

  • 开发人员会注意到使用了不同的算法......然后大声抱怨.

因此,使用不同算法进行Java(TM)实现的可能性非常小.

(*我在网上找不到Java 1.1 javadocs,但我希望他们能说同样的话.)