“isProbablePrime”真的需要花大部分时间阅读文件吗?

时间:2012-08-21 22:49:46

标签: java random

我刚刚解决了the Project Euler Problem 60,但我的程序仍然有点太慢了。我发现大部分时间花在阅读文件......

看起来BigInteger.isProbablePrime使用SecureRandom,它始终从Linux设备读取。我的问题是:

  • 是否真的有必要使用SecureRandom
  • 是否使用/dev/random/dev/urandom
  • 从操作系统中读取它们真的是产生良好随机数的最佳方法吗?

AFAIK,java用于从操作系统中获取几个字节,用作基于SHA1的PRNG的种子,应该恕我快速。

2 个答案:

答案 0 :(得分:1)

  

从操作系统读取它们真的是产生良好随机数的最佳方法吗?

我不知道isProbablePrimeSecureRandom尝试通过相应的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预先计算质数达到极限。这给了我足够快的初步测试。