4

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

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

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

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

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

这可以做到吗?还是不可能?

4

3 回答 3

6

看看Uncommons Maths(完全披露:我写的)。它应该可以解决您在 Java 中遇到的大多数随机数问题。

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

我认为 SecureRandom.generateSeed 是您在不依赖任何特定平台或 Internet 的情况下可以做到的最好的方法。

于 2008-09-25T23:28:03.313 回答
0

System.currentTimeMillis()与每次生成种子时递增的全局计数器结合使用。使用AtomicLong作为计数器,这样您就可以提高效率和线程安全性。

“组合”并不意味着“添加”或“异或”,因为它太容易得到重复。相反,哈希。您可能会变得复杂,将 long 和计数器填充到例如 16 字节和 MD5 中,但我可能会使用 Adler CRC 或其他一些64 位 CRC的 64 位版本。

于 2008-09-25T23:35:55.867 回答
0

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

于 2008-09-26T13:10:46.303 回答