java.util.Random 安全_java.util.Random有多好?

在某种程度上,随机数发生器是马的马。 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仍然有点低!)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值