栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

随机数分布

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

随机数分布

我真正的问题是选项1在数学上是否有效。

让我们从选项2开始。所使用的随机数生成器

java.util.Random
在javadoc中指定如下:

该类使用48位种子,可以使用线性同余公式对其进行修改。(请参见Donald Knuth,计算机编程艺术,第2卷,第3.2.1节)。

各种方法的javadocs中有更具体的细节。

但是关键是我们正在使用由线性同余公式生成的序列,并且这些公式具有很大程度的自相关…这可能是有问题的。

现在,在选项1中,您

Random
每次都使用一个具有新种子的不同实例,并应用一轮LC公式。因此,您得到的数字序列可能与种子自相关。但是,种子的生成方式不同,具体取决于Java版本。

Java 6这样做:

 public Random() { this(++seedUniquifier + System.nanoTime()); } private static volatile long seedUniquifier = 8682522807148012L;

…这不是完全随机的。如果您

Random
以固定的间隔创建实例,则种子很可能间隔很近,因此,选项#1产生的随机数序列可能会自动关联。

相比之下,Java 7和8做到了:

 public Random() {     this(seedUniquifier() ^ System.nanoTime()); } private static long seedUniquifier() {     // L'Ecuyer, "Tables of Linear Congruential Generators of     // Different Sizes and Good Lattice Structure", 1999     for (;;) {         long current = seedUniquifier.get();         long next = current * 181783497276652981L;         if (seedUniquifier.compareAndSet(current, next))  return next;     } } private static final AtomicLong seedUniquifier     = new AtomicLong(8682522807148012L);

由上述方法产生的种子的序列可能是(真实)随机性的更好近似。这可能会使您的选择#1优于选择#2。

Java 6至8中的#1选项的缺点是,

System.nanoTime()
可能的调用涉及系统调用。那是比较昂贵的。


因此,简短的答案是,从数学的角度来看,选项#1和选项#2中哪个产生了更好的质量“随机”数字,这是Java版本所特有的。

在这两种情况下,在足够大的样本量下,数字的分布将是均匀的,尽管我不确定在确定性过程中谈论概率分布是否有意义。

但是,这两种方法都不适合用作“密码强度”随机数生成器。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402129.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号