Java提供了Random
类的一个子类SecureRandom类。描述包括:
该类提供了一个密码强的随机数发生器(RNG)。许多实现都是伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真随机种子生成伪随机序列。其他实现方式可以产生真正的随机数,但其他人可能使用这两项技术
Java提供的只是一个实现中,SHA1PRNG
功能,结合其details作为一个伪随机数生成器(PRNG)算法:
该实现遵循IEEE P1363标准,附录G.7:“扩展源位”,并使用SHA-1作为PRNG的基础。它计算SHA-1哈希上的真随机种子值与64位计数器连接,每个操作增加1。从160位SHA-1输出中,仅使用64位。
还应当指出的是,从OpenSSL中bn_rand_range
功能也considered使用伪随机数生成器(PRNG)算法,但我找不到细节的什么算法的功能实现。
由于SecureRandom
是Random
类的子类,SecureRandom
对象可以使用的Random
所有方法包括.nextInt(int n)
方法。该nextInt
方法提供:
返回一个伪随机均匀分布的int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。
因此,产生的(0,100],你可以使用如下代码范围内的加密的强伪随机数:
import java.security.SecureRandom;
class secure{
public static void main(String[] args) throws Exception{
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
System.out.println(random.nextInt(100));
}
}
我已经在java中使用SecureRandom实现bn_rand_range。问题是,是否有一个函数的实现行为像bn_rand_range,而不是bn_rand。 – diedthreetimes 2012-03-11 19:06:58
我已更新答案以显示代码以模仿bn_rand_range。你提到找到0到X之间的数字,所以我只用nextInt。如果你想要一个X和Y之间的范围,你可以使用'random.nextInt(Y-X)+ X' – amccormack 2012-03-11 19:53:32
对不起,我忘了提X不是int,而是BigInteger。否则,你的方法就是我正在寻找的。 – diedthreetimes 2012-03-11 20:37:20