如何安全地生成特定范围内的随机整数值?
我知道很多人以前问过这个问题,例如this post,但是这个方法似乎并不安全。让我解释一下:
'Math‘库有Math.random()
,它生成[0,1]范围内的随机值。使用它,人们可以构造一个算法,比如
int randomInteger = Math.floor(Math.random() * (Integer.MAX_VALUE - Integer.MIN_VALUE + 1) + Integer.MIN_VALUE)
在Integer.MAX_VALUE
和Integer.MIN_VALUE
之间生成一个随机数。但是,Integer.MAX_VALUE - Integer.MIN_VALUE
将溢出。
我们的目标不仅仅是生成随机数,而是均匀地生成它们,这意味着1出现的概率与Integer.MAX_VALUE
相同。我知道有一些解决办法,比如将大值转换为long,但问题仍然是如何从Long.MIN_VALUE
生成一个长整型值到Long.MAX_VALUE
。
我也不确定其他预先编写的算法,因为它们也可能溢出并导致概率分布发生变化。所以我的问题是,是否有一个数学方程只使用整数(不会转换为long anywhere)和Math.random()
来生成从Integer.MIN_VALUE
到Integer.MAX_VALUE
的随机数。或者是否有人知道任何不会在内部溢出的随机生成器?
发布于 2018-06-02 03:02:25
更好的方法可能是使用java.security.SecureRandom,它是一种加密功能很强的随机数生成器。
https://stackoverflow.com/questions/50647343
复制相似问题