我刚刚解决了the Project Euler Problem 60,但我的程序仍然有点太慢了。我发现大部分时间花在阅读文件......
看起来BigInteger.isProbablePrime
使用SecureRandom
,它始终从Linux设备读取。我的问题是:
SecureRandom
?/dev/random
或/dev/urandom
?AFAIK,java用于从操作系统中获取几个字节,用作基于SHA1的PRNG的种子,应该恕我快速。
答案 0 :(得分:1)
从操作系统读取它们真的是产生良好随机数的最佳方法吗?
我不知道isProbablePrime
但SecureRandom
尝试通过相应的OS函数获取随机数,该函数具有非常好的随机函数属性。
在Linux中,这由两个虚拟设备/dev/random
和/dev/urandom
发生,当您从文件中读取时,这些位是不可预测的随机的,并根据发生在系统中的事件生成。
/ dev / random或/ dev / urandom会被使用吗?
实际上这是可配置的,你可以看到这一点
打开JRE security.properties
中的lib\security
文件。那里有一个配置条目。在我的安装中指定了/dev/urandom
。
如果新的随机位不可用,则/dev/random
和/dev/urandom
之间的差异是/dev/random
阻止
答案 1 :(得分:0)
对于Euler 60来说,BigInteger和SecureRandom都是过度的(而且很慢)。对于这类问题,您不需要SecureRandom的加密属性;普通随机将很好地服务。
答案中最大的数字远低于您需要使用BigInteger的范围。对于我的解决方案,我使用Eratosthenes预先计算质数达到极限。这给了我足够快的初步测试。