2010-11-10 105 views
2
I would like to generate random numbers between 1 & 10, with a decimal place of 1 
(e.g. 1.5, 9.4, 6.3, 2.9) 

I would like to generate random numbers between 1 & 10, with 2 decimal places 
(e.g. 1.51, 9.46, 6.32, 2.93) 

I would like to generate random numbers between 1 & 10, with 3 decimal places 

    (e.g. 1.512, 9.346, 6.329, 2.935) 

一種解決方案是將一個隨機數生成器僅用於小數位,然後與數字連接。有沒有更簡單的方法來實現這一點?如何生成一個具有小數位的隨機數

+0

嘗試java.util.Random – Sid 2010-11-10 10:46:05

回答

11

雖然BigDecimal的解決方案更加靈活,這是一個使用int和double一個簡單的解決方案。此方法採用一個Random對象,小數點的上界和下界和一個號碼和返回一個相應格式的字符串:

/** 
* Generate a decimal string representation of a random number within the 
* supplied bounds. 
* 
* @param random 
*   the random object (if null, a new one will be created) 
* @param lowerBound 
*   the lower bound, inclusive 
* @param upperBound 
*   the upper bound, inclusive 
* @param decimalPlaces 
*   the decimal places of the result 
* @return the formatted string 
*/ 
public static String getRandomValue(final Random random, 
    final int lowerBound, 
    final int upperBound, 
    final int decimalPlaces){ 

    if(lowerBound < 0 || upperBound <= lowerBound || decimalPlaces < 0){ 
     throw new IllegalArgumentException("Put error message here"); 
    } 

    final double dbl = 
     ((random == null ? new Random() : random).nextDouble() // 
      * (upperBound - lowerBound)) 
      + lowerBound; 
    return String.format("%." + decimalPlaces + "f", dbl); 

} 

測試代碼:

final Random rnd = new Random(); 

for(int decpl = 0; decpl < 3; decpl++){ 
    for(int low = 0; low < 2; low++){ 
     for(int high = low + 1; high < low + 3; high++){ 
      System.out.println("Random Value between " + low + " and " 
       + high + " with " + decpl + " decimal places:"); 
      System.out.println(getRandomValue(rnd, low, high, decpl)); 
     } 
    } 
} 

輸出:

Random Value between 0 and 1 with 0 decimal places: 
0 
Random Value between 0 and 2 with 0 decimal places: 
1 
Random Value between 1 and 2 with 0 decimal places: 
1 
Random Value between 1 and 3 with 0 decimal places: 
3 
Random Value between 0 and 1 with 1 decimal places: 
0.6 
Random Value between 0 and 2 with 1 decimal places: 
1.5 
Random Value between 1 and 2 with 1 decimal places: 
1.1 
Random Value between 1 and 3 with 1 decimal places: 
1.9 
Random Value between 0 and 1 with 2 decimal places: 
0.52 
Random Value between 0 and 2 with 2 decimal places: 
0.82 
Random Value between 1 and 2 with 2 decimal places: 
1.75 
Random Value between 1 and 3 with 2 decimal places: 
1.10 
+0

與我發佈的簡單解決方案相比,有什麼優勢? – christian 2010-11-10 11:07:05

+0

它可以重複使用許多不同的參數。如果您一次使用此類功能,請按照您的方式進行。如果您多次使用它,請按照我的方式進行。 – 2010-11-10 11:15:16

3

根據您的需要小數

4

那麼一個顯而易見的建議是,以產生一個整數,並適當地把它生成一張雙人牀和比格式。因此對於3DPs,您會生成1000到9999之間的數字(或10000,取決於您想要的確切界限),然後將其除以10000.

我建議您在實際分區中使用BigDecimal,以維護小數點。

+0

當然,如果他需要結果作爲一個'double',無論如何,使用BigDecimal都沒有意義。 – sleske 2010-11-10 10:15:04

+0

@sleske:真的 - 但在那一點,「小數位」的想法變得有點奇怪。 – 2010-11-10 10:23:49

8

1)
(int) ((Math.random() * 90) + 10)/10.0
2)
(int) ((Math.random() * 900) + 100)/100.0
3)
(int) ((Math.random() * 9000) + 1000)/1000.0