2015-07-02 71 views
0

我寫一個函數來生成Long.MIN_VALUE和Long.MAX_VALUE之間的隨機長整型值,但它總是返回Long.MIN_VALUE,爲什麼?隨機長總是最小值

public static long randomLong() { 
    return (long) (Math.random()*(Long.MAX_VALUE-Long.MIN_VALUE)+Long.MIN_VALUE); 
} 

謝謝你幫我

+1

你認爲它應該返回,爲什麼? –

+1

表達式中的數字溢出 – Andrew

+0

我該如何解決它?當數字大於Long.MAX_VALUE時出現數字溢出?之前沒有這種類型的問題,我需要更多的信息 –

回答

2

的問題是,你的長期價值四溢。由於Long.MIN_VALUE對於有符號長整數爲負,因此Long.MAX_VALUE-Long.MIN_VALUE大於Long.MAX_VALUE,因此在中間計算期間不適合長整數。

嘗試使用nextLong代替:

public static long randomLong() { 
    Random ran = new Random(); 
    return ran.nextLong(); 
} 
2

Long.MAX_VALUE - Long.MIN_VALUE結果是-1由於溢出。該值乘以Math.random(),其值爲0.0(含)和1.0(不含)。這是一個double,Long.MIN_VALUE被添加到-1.00.0之間的值,結果仍然是Long.MIN_VALUE。 A double的精確度不足以與Long.MIN_VALUE相比增加非常小的內容,因此結果爲Long.MIN_VALUEdouble

要檢索均勻分佈的隨機long,請使用Random類及其method nextLong()

// This Random object can be stored in the class for reuse 
Random rnd = new Random(); 

然後:

return rnd.nextLong();