[英]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_VALUE
和Integer.MIN_VALUE
之間生成一個隨機數。 但是, Integer.MAX_VALUE - Integer.MIN_VALUE
會溢出。
目標不僅僅是生成隨機數,而是均勻地生成它們,這意味着 1 與Integer.MAX_VALUE
出現的概率相同。 我知道有一些變通方法,例如將大值轉換為 long 但問題又是如何生成從Long.MIN_VALUE
到Long.MAX_VALUE
的長整數值。
我也不確定其他預先編寫的算法,因為它們也會溢出並導致概率分布發生變化。 所以我的問題是是否有一個數學方程只使用整數(沒有在任何地方轉換為 long)和Math.random()
來生成從Integer.MIN_VALUE
到Integer.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.