在某种程度上,随机数发生器是马的马。 Random类实现具有合理选择的参数的LCG。但它仍然表现出以下特点:
>相当短的时期(2 ^ 48)
>位不是同样随机的(见我的文章randomness of bit positions)
>将只生成一小部分值的组合(着名的问题“falling in the planes”)
如果这些事情对你不重要,那么Random具有作为JDK的一部分提供的赎回功能。这对于休闲游戏(但不包括涉及金钱的游戏)是很好的。没有弱的种子本身。
另一个选择是XORShift generator,它可以在Java中实现如下:
public long randomLong() {
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
return x;
}
对于一些非常便宜的操作,这具有2 ^ 64-1(不允许零)的周期,并且足够简单,以便在重复生成值时内联。各种移位值是可能的:有关更多详细信息,请参阅George Marsaglia的XORShift Generators文章。您可以将生成的数字中的位视为同等随机。一个主要的缺点是,偶尔会进入一个“车辙”,其中没有很多位设置在数字,然后花费几代来摆脱这个车辙。
其他可能性是:
>组合不同的生成器(例如,将XORShift生成器的输出馈送到LCG,然后将结果添加到具有不同参数的XORShift生成器的输出):这通常允许不同方法的弱点被“平滑”如果仔细选择组合发电机的周期,则可以给出更长的周期
>添加“滞后”(给出更长的周期):实质上,其中发生器通常将变换所生成的最后一个数,存储“历史缓冲器”并且变换,例如,(n-1023)。
我会说避免使用愚蠢的内存量的生成器给你一个比你真正需要的时间更长的时间(有些有一个周期大于宇宙中的原子数 – 你真的通常不需要)。注意,“长周期”不一定意味着“高质量发电机”(虽然2 ^ 48仍然有点低!)。