使用 Random 类的随机数使用一种算法,该算法可以对 int 进行位破坏,从而为您提供新的 int。无论您调用它的速度或次数,它都会使用相同的算法。进阶就是进阶。
要对此进行测试,请为其播种一个数字,例如 42。然后观察进程。再次用相同的号码播种。完全相同的进展。
这种方法的缺点是数字不是真正随机的。它们非常随机,对于大多数事情来说已经足够了,但不是完全随机的。
我通过顽固的测试电池运行了 Random 方法的输出。它以优异的成绩通过了其中的大多数,一个是临界的,一个是完全失败的。这就是我们所说的随机性。
另外,因为它使用日期时间戳来播种自己,所以在某些情况下它是可以预测的。想象某人每周一早上启动并运行您的任务,这是该周的第一件事。有一些可预测性,因为它将以星期一早上 8 点到 8:30 之间的时间戳运行。
因此,对于大多数与安全性无关的操作,Random 已经足够好了。甚至很多。
另一方面,SecureRandom 将生成真正的随机数。它通过查看系统时序和其他基于无数因素而从秒到秒变化的事物来做到这一点。
缺点是这些因素在一秒钟内变化的频率非常高,因此 SecureRandom 在一段时间内只能生成有限数量的随机数。它确实会尝试提前生成一些并缓存它们以供使用,但是您可以破坏缓存。
这样,就像我的反渗透滤水器一样。它装有一加仑已经过滤过的水。如果你一次性使用一加仑水,那么你会以过滤它的速度得到它——大约每 5 秒 1 盎司或类似的东西。第一加仑很快,然后真的很慢。