繁体   English   中英

在Java中的某个范围之间安全地生成随机数

[英]Safely generate random numbers between some range in Java

如何安全地生成特定范围内的随机整数值?

我知道以前有很多人问过这个问题,例如这篇文章,但该方法似乎并不安全。 让我解释:

'Math' 库具有Math.random() ,它生成范围 [0, 1) 内的随机值。 使用它,人们可以构建一种算法,如

int randomInteger = Math.floor(Math.random() * (Integer.MAX_VALUE - Integer.MIN_VALUE + 1) + Integer.MIN_VALUE)

Integer.MAX_VALUEInteger.MIN_VALUE之间生成一个随机数。 但是, Integer.MAX_VALUE - Integer.MIN_VALUE会溢出。

目标不仅仅是生成随机数,而是均匀地生成它们,这意味着 1 与Integer.MAX_VALUE出现的概率相同。 我知道有一些变通方法,例如将大值转换为 long 但问题又是如何生成从Long.MIN_VALUELong.MAX_VALUE的长整数值。

我也不确定其他预先编写的算法,因为它们也会溢出并导致概率分布发生变化。 所以我的问题是是否有一个数学方程只使用整数(没有在任何地方转换为 long)和Math.random()来生成从Integer.MIN_VALUEInteger.MAX_VALUE随机数。 或者,如果有人知道任何不会在内部溢出的随机生成器?

'Math' 库有 Math.random(),它在 [0, 1) 范围内生成一个随机值。

所以不要使用Math.random() - 使用这个:

Random r = new Random();
int i = r.nextInt();

nextInt的文档说:

nextInt() - 从这个随机数生成器的序列中返回下一个伪随机、均匀分布的 int 值。 所有 2^32 个可能的 int 值都以(大约)相等的概率产生。

看来我稍微误解了这个问题,你需要long而不是int - 幸运的是合同是一样的。

long l = r.nextLong()

从字面上看,这将需要两个整数并将它们塞在一起以形成一个长整数。

更好的方法可能是使用java.security.SecureRandom ,它是一种加密强随机数生成器 (RNG)。

随机 x = 新随机 (1000); // 代码运行并生成值 1000 int i = x.nextInt();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM