看完这个答案后: best way to pick a random subset from a collection?
让我想知道,如何在Java中选择一个随机种子?
并且不要说使用System.currentTimeMillis()或System.nanoTime()。阅读文章,看看为什么不。
这是一个很难的问题,但让我更难。假设您需要生成随机种子而不连接到互联网,而不使用用户输入(IE,没有gui),并且它必须是跨平台的(因此没有JNI来访问硬件)。
我们可以监控一些JVM变量作为我们随机性的来源吗?
可以这样做吗?或者这是不可能的?
答案 0 :(得分:6)
看看Uncommons Maths(完全披露:我写了)。它应该解决Java中随机数所带来的大多数问题。
即使如果你不使用它,你也应该能够从它提供的各种SeedGenerator实现中获得一些想法。基本上,它默认使用/dev/random。如果不存在(例如Windows),则会尝试从random.org下载数据,或者使用SecureRandom.generateSeed。
我认为SecureRandom.generateSeed是您可以做的最好的,不依赖于特定平台或互联网。
答案 1 :(得分:0)
将System.currentTimeMillis()
与每次生成种子时递增的全局计数器组合在一起。使用AtomicLong作为计数器,这样您就可以提高效率和线程安全性。
“组合”并不意味着“添加”或“xor”,因为它太容易获得重复。相反,哈希。你可能会变得复杂,并将长和计数器填入例如16字节和MD5它,但我可能会使用64位版本的Adler CRC或其他64-bit CRC。
答案 2 :(得分:0)