簡體   English   中英

Java中使用Math.random()的隨機數

[英]Random numbers with Math.random() in Java

為了生成隨機數,我使用了公式:

(int)(Math.random() * max) + min

我在Google上找到的公式似乎總是如下:

(int)(Math.random() * (max - min) + min)

哪一個對嗎? 據我所知,我的公式中從未得到超出我的范圍的數字

您的公式會在min和min + max之間生成數字。

谷歌發現的那個產生了最小和最大之間的數字。

谷歌贏了!

更好的方法是:

int x = rand.nextInt(max - min + 1) + min;

您的公式會在minmin + max之間生成數字。

Random random = new Random(1234567);
int min = 5;
int max = 20;
while (true) {
    int x = (int)(Math.random() * max) + min;
    System.out.println(x);
    if (x < min || x >= max) { break; }
}       

結果:

10
16
13
21 // Oops!!

在這里在線查看: ideone

你的:最低可能是分鍾,最高可能是最高+分鍾-1

Google:最低可能是分鍾,最高可能是max-1

第一個生成錯誤范圍內的數字,而第二個生成錯誤。

為了表明第一個是不正確的,讓我們說min是10而max是20.換句話說,結果預計大於或等於10,嚴格小於20。 如果Math.random()返回0.75 ,則第一個公式的結果為25 ,超出范圍。

如果min=10max=100

(int)(Math.random() * max) + min        

給出10到110之間的結果,而

(int)(Math.random() * (max - min) + min)

給出10到100之間的結果,因此它們是非常不同的公式 這里重要的是清晰度,所以無論你做什么,都要確保代碼清楚地說明了生成的內容。

(PS。如果你將變量'max'更改為'range',第一個更有意義)

谷歌是對的:-)

Google的公式會在: min和max之間創建數字您的公式會在: min和(min + max)之間創建數字

int i = (int) (10 +Math.random()*11);

這將給你10到20之間的隨機數。

這里的關鍵是:

a + Math.random()*b

起始編號(10)和結束編號是最大編號(20) - a(10)+ 1(11)

請享用!

如果min = 5max = 10 ,並且Math.random()返回(幾乎)1.0,則生成的數字將(幾乎)為15,這顯然大於所選的max

相關地,這就是為什么每個隨機數API都應該允許您明確指定min和max。 您不應該編寫與您的問題域相關的容易出錯的數學。

您在Google上找到的公式存在一個小問題。 它應該是:
(int)(Math.random() * (max - min + 1) + min)

(int)(Math.random() * (max - min) + min)

max - min + 1是可以生成隨機數的范圍

的Math.random()

返回帶有正號的double值,大於或等於0.0且小於1.0。

現在它取決於你想要完成什么。 例如,當您想要從1到100的數字時,您只需要添加

(int)(Math.random()*100)

所以100是值的范圍。 如果要將范圍的開頭更改為20到120,則必須在結尾添加+20。

所以公式是:

(int)(Math.random()*range) + min

而且你總是可以用max-min來計算范圍,這就是為什么谷歌會給你這個公式。

Math.random()生成一個介於0(包括)和1(不包括)之間的數字。

所以(int)(Math.random() * max)范圍從0max-1含)。

然后(int)(Math.random() * max) + min范圍從minmax + min - 1 ,這不是你想要的。

谷歌的公式是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM