1

我刚刚解决了 Project Euler Problem 60,但我的程序还是有点太慢了。我发现大部分时间都花在读取文件上......

它看起来像是一直从 Linux 设备读取的BigInteger.isProbablePrime用途。SecureRandom我的问题是:

  • 真的有必要使用SecureRandom吗?
  • /dev/random习惯了还是/dev/urandom习惯了?
  • 从操作系统中读取它们真的是生成良好随机数的最佳方式吗?

AFAIK,java曾经从操作系统中获取几个字节,这些字节被用作基于SHA1的PRNG的种子,恕我直言,这应该更快。

4

2 回答 2

1

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

我不知道,isProbablePrimeSecureRandom试图通过相应的操作系统函数获得一个随机数,该函数对随机函数具有非常好的特性。
在 Linux 中,这由两个虚拟设备发生/dev/random/dev/urandom当您从文件中读取时,这些位是不可预测的随机位,并且是根据系统发生的事件生成的。

/dev/random 或 /dev/urandom 是否被使用?

实际上这是可配置的,您可以看到这一点。在您的 JRE中
打开该security.properties文件。lib\security那里有一个配置条目。在我的安装/dev/urandom中是指定的。

/dev/random和之间的区别在于,如果新的随机位不可用/dev/urandom,则/dev/random 阻塞

于 2012-08-21T23:01:14.857 回答
0

BigInteger 和 SecureRandom 对于 Euler 60 来说都是过度杀伤(而且速度很慢)。对于这类问题,您不需要 SecureRandom 的加密属性;普通的 Random 会非常好用。

答案中的最大数字远低于您需要使用 BigInteger 的范围。对于我的解决方案,我使用 Eratosthenes 预先计算素数,直至达到极限。这给了我足够快的主要测试。

于 2012-08-22T13:27:11.833 回答