是否保证两次连续调用安全随机数会给出不同的数字?

Cra*_*lus 1 java random integer sha1 secure-random

使用SecureRandom是否可以保证2个连续调用不会返回相同的数字?
如果这是客户端 API 端的严格要求,那么代码中的以下循环是否多余?

Random random = SecureRandom.getInstance("SHA1PRNG");  
long value1 = (long)(r.nextDouble() * LIMIT) + 1;  
long value2 = (long)(r.nextDouble() * LIMIT);  

while(value1 == value2) {  
   value2 = (long)(r.nextDouble() * LIMIT);  
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我没想到会有。每个调用应该是独立的 -要求下一个调用不给出与前一个调用相同的结果意味着它不是随机的,IMO。

举一个更小的例子,假设我们没有nextDouble一个返回 1 到 3(含)范围内的值的方法。通过消除两次返回相同值的可能性,您可以有效地将每次调用限制为 50/50 选择,而没有明显的原因。您将向任何可以观察“此”呼叫的人提供有关下一次呼叫的额外信息。

现在显然有一个更大的范围 - 因此两个真正随机选取的值相同的值double要小得多。不完全是 2 64中的 1 ,但相当大。

当然,您已经通过算术减少了一些 - 即使确实nextDouble() 保证总是返回不同的值,两个值在乘以然后转换为时完全有可能double具有相同的结果。想象一下,例如,如果 2...您希望看到多少个可能的值?LIMITlongLIMIT

所以不,如果您有严格的客户要求,我认为您拥有的代码不是多余的。