Java中选择随机种子的跨平台方法是什么?
读完这个答案后: 这让我想知道,如何在Java中随机挑选种子 不要说使用System.currentTimeMillis()或System.nanoTime()。阅读这篇文章,看看原因 这是一个很难回答的问题,但让我更难回答。假设您需要生成一个随机种子,而无需连接到internet,无需使用用户输入(即,没有gui),并且它必须是跨平台的(因此没有JNI来访问硬件) 是否有一些JVM变量可以作为随机性的来源进行监控 这能做到吗?还是不可能?看看(完全披露:我写的)。它可以解决Java中随机数的大部分问题 甚至,如果您不使用它,您应该能够从它提供的各种实现中获得一些想法。基本上,它默认使用。如果不存在(例如Windows),它会尝试从下载数据或使用Java中选择随机种子的跨平台方法是什么?,java,random,cross-platform,random-seed,Java,Random,Cross Platform,Random Seed,读完这个答案后: 这让我想知道,如何在Java中随机挑选种子 不要说使用System.currentTimeMillis()或System.nanoTime()。阅读这篇文章,看看原因 这是一个很难回答的问题,但让我更难回答。假设您需要生成一个随机种子,而无需连接到internet,无需使用用户输入(即,没有gui),并且它必须是跨平台的(因此没有JNI来访问硬件) 是否有一些JVM变量可以作为随机性的来源进行监控 这能做到吗?还是不可能?看看(完全披露:我写的)。它可以解决Java中随机数的
我认为SecureRandom.generateSeed是不依赖任何特定平台或互联网的最佳选择。将
System.currentTimeMillis()
与全局计数器相结合,每次生成种子时,该计数器都会递增。用于计数器,以便提高效率和线程安全性
“Combine”并不意味着“add”或“xor”,因为它太容易获得副本。取而代之的是散列。你可能会变得复杂,把long和计数器塞进例如16字节和MD5,但我可能会使用64位版本的Adler CRC或其他一些。嗯,那篇文章说32位种子不好,但64位种子好。System.currentTimeMillis()是一个64位种子。哦,哇,你也有一个组合生成器!几天前我就写了一个这样的问题……我在我的另一个问题中添加了Uncommons数学:我希望您使用https连接到random.org。当前十六进制的currentTimeMillis()是:0x00 00 01 1C 9F B4 CF 78这看起来是一个非常好的64位数字吗?当然,您可以将其哈希为更好的64位数字,但您的源代码仍然小于64位。在我的应用程序中,我实际上需要超过700位的种子。