在Java中选择随机种子的跨平台方法是什么?

时间:2020-03-06 14:45:24  来源:igfitidea点击:

阅读此答案后:
从集合中选择随机子集的最佳方法?

我很纳闷,如何从Java中挑选随机种子?

而且不要说使用System.currentTimeMillis()或者System.nanoTime()。阅读文章以了解为什么不这样做。

这是一个很难的问题,但是让我更难一些。假设我们需要生成一个随机种子而不连接到互联网,而不使用用户输入(IE,没有gui),并且必须是跨平台的(因此没有JNI可以访问硬件)。

是否可以监视一些JVM变量作为随机性的来源?

能做到吗?还是不可能?

解决方案

看看"罕见的数学"(完整披露:我写的)。它应该可以解决Java中使用随机数所遇到的大多数问题。

即使不使用它,我们也应该能够从它提供的各种SeedGenerator实现中获得一些想法。基本上,它默认使用/ dev / random。如果不存在(例如Windows),则它或者尝试从random.org下载数据,或者使用SecureRandom.generateSeed。

我认为SecureRandom.generateSeed是我们不依赖特定平台或者Internet即可做到的最好方法。

将" System.currentTimeMillis()"与一个全局计数器结合起来,该全局计数器在每次生成种子时都会增加。使用AtomicLong作为计数器,这样可以提高效率和线程安全性。

"合并"并不表示"添加"或者"异或者",因为获取重复项太容易了。相反,哈希。我们可能会变得很复杂,并将长时间和柜台塞入例如16字节和MD5,但我可能会使用64位版本的Adler CRC或者其他一些64位CRC。

嗯,那篇文章说32位种子是不好的,但64位种子是好的。 System.currentTimeMillis()是64位种子。