簡體   English   中英

Java 隨機雙精度區間 [-1000, 1000]

[英]Java Random double in interval [-1000, 1000]

在java中我有:

Random random = new Random();
double randomNum = random.nextDouble();

它創建了一個介於 0 和 1 之間的隨機數。但是我想要一個介於 -1000 和 1000 之間的數字,我該如何縮放呢?

謝謝

2種可能性:

  1. [密度較小]:將結果乘以2000,然后從結果中減去1000。 它不會像可能性2那樣“密集”。
  2. 在范圍[-1000,999]中得到一個隨機int,並在范圍[0,1]中添加一個隨機雙精度數。

請注意,可能性2確保了更好的隨機性和更好的“密度”,以2次隨機調用為代價[如果這是一個問題,這可能是擴展性的]。

嗯,數學?

double randomNum = (random.nextDouble()-0.5d) * 2000;
Random random = new Random();
double randomNum = (random.nextDouble() * 2000.0d) - 1000.0d;
 public  static double randomInterval(double minValue,double maxValue){
    Random random = new Random();
    double r;
    do {
        r = random.nextDouble();
    } while (r < minValue || r >= maxValue);
    return r;
}

例子 :

double a = randomInterval(-1000,1000) ;

試試這個算法:

  1. 生成0到1范圍內的隨機值。
  2. 將該值乘以2000(所需范圍的大小)。
  3. 從步驟2的結果中減去1000(將值移到所需范圍內)。

這會為您提供該范圍內的數字

double randomNum = (random.nextDouble() * 2000) -1000;
Random random = new Random();
int randomNum = random.nextInt(2000) - 1000;

這是一個通用函數,您可以使用val01零到一( val01 )之間的數字線性重新縮放到不同的范圍( min .. max ):

    public static double rescale(double val01, double min, double max) {
        return val01 * (max - min) + min;
    }
public static double doubleBetween(double start, double end) {
    Random random = new Random();

    // We need 64 bits because double have 53 bits precision, so int is too short
    // We have now a value between 0 and Long.MAX_VALUE.
    long value = -1L;
    while (value < 0)
      value = Math.abs(random.nextLong()); // Caution, Long.MIN_VALUE returns negative !


    // Cast to double
    double valueAsDouble = (double) value;

    // Scale so that Long.MAX_VALUE is exactly 1 !
    double diff = (end-start)/(double) Long.MAX_VALUE;


    return start + valueAsDouble*diff;
}

這將給出正確的間隔,包括兩端的全雙精度。 雙精度具有一個特殊的-0.0值(負零),該程序不會給出該值。

暫無
暫無

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

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