看完这个答案后: 从集合中选择随机子集的最佳方法?

让我想知道,如何在Java中选择随机种子?

并且不要说使用System.currentTimeMillis()或System.nanoTime()。阅读文章,看看为什么不。

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

我们可以监控一些JVM变量作为我们随机性的来源吗?

可以这样做吗?或者这是不可能的?

有帮助吗?

解决方案

查看 Uncommons Maths (完全披露:我写了它)。它应该解决Java中随机数所带来的大多数问题。

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

我认为SecureRandom.generateSeed是您可以做的最好的,不依赖于特定平台或互联网。

其他提示

System.currentTimeMillis()与全局计数器结合使用,每次生成种子时都会递增该计数器。使用 AtomicLong 对于计数器,您可以提高效率和线程安全性。

"结合"并不意味着“添加”或“xor”或“xor”。因为它很容易得到重复。相反,哈希。你可能会变得复杂,并将长和计数器填入例如16个字节和MD5它,但我可能会使用64位版本的Adler CRC或其他一些 64位CRC

嗯,那篇文章说32位种子很糟糕,但64位种子很好。 System.currentTimeMillis()是一个64位种子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top