在某种程度上,随机数生成器是课程的主角。 Random类使用合理选择的参数实现LCG。 但是它仍然具有以下功能:
相当短的时间(2 ^ 48)
比特并非均等地随机(请参阅我关于比特位置随机性的文章)
只会产生一小部分值的组合(著名的“落入平面”问题)
如果这些对您来说都无关紧要,那么Random可以作为JDK的一部分提供赎回功能。 对于休闲游戏(但不是涉及金钱的游戏)来说,它已经足够了。 没有弱种子这样的种子。
另一个替代方法是XORShift生成器,可以用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仍然有点低!)。