簡體   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