public static void main(String[] args)
{
Random ranGen = new SecureRandom();
ranGen.setSeed(0);
int randomNumber = ranGen.nextInt(2);
System.out.print(randomNumber);
}
上述代码是否是生成真正随机且安全/无偏0或1的好方法?
答案 0 :(得分:1)
不,它不是(产生真正随机且安全/无偏0或1的好方法)。
new SecureRandom()
没问题,但是在isn&t之后直接设置种子。 Oracle "SHA1PRNG"
的实现 - 通常是默认设置 - 如果在从setSeed()
检索到任何熵之前调用了SecureRandom
,则将替换初始种子随机数发生器。
如果没有播种,setSeed()
实施将使用操作系统的熵源播种。这应该是相对安全的。通常,操作系统是唯一可以访问真实硬件设备的部分,因此它比JVM更适合检索熵。您可以调用nextBytes()
,但只应在调用nextInt(2)
后调用它,请求至少一个字节。之后,您可以将一些种子添加到池中。
最后,调用nextBoolean()
是可以的,但效率不高。它将请求32位,然后丢弃它不需要的31位。请求随机字节并从阵列中提取位将更有效(如果需要效率,则不要过度优化)。调用{{1}}可能只会丢掉7位,因此效率至少提高4倍,而且更加简洁。