簡體   English   中英

兩雙之間的隨機偶數對數分布

[英]Random Even Logarithmic Distribution Between Two Doubles

也許我已經想過了,但是我試圖找到一種很好的方法來獲取均勻對數分布的兩個點之間的隨機數。 假設我有兩個邊界0.001和1000,我想找到6個對數均勻分布的隨機數。 所以像這樣的數字:0.002、0.033、0.543、1.634、34.673、765.234 ...現在說我正在尋找7個隨機數,它們在該范圍內也將大致均勻地排序...我正在使用爪哇

這是你想要的嗎? 我將數字均勻分布在由限制的對數形成的范圍內,然后使用Math.exp轉換回實際范圍。 我對結果數組進行了排序,因為您的示例顯示了排序后的數據。 如果不希望,請刪除Arrays.sort調用。

為簡單起見,我跳過了邊界檢查。 大概是0 <lowerLimit <upperLimit。

檢查極限是因為舍入誤差至少在理論上可能導致結果超出所需范圍。

import java.util.Arrays;
import java.util.Random;

public class Test {
  public static void main(String[] args) {
    Random rand = new Random(3);
    System.out.println(Arrays.toString(logRandom(rand, 0.001, 1000, 7)));
    System.out.println(Arrays.toString(logRandom(rand, 0.001, 1000, 7)));
    System.out.println(Arrays.toString(logRandom(rand, 0.001, 1000, 7)));
    System.out.println(Arrays.toString(logRandom(rand, 0.001, 1000, 7)));
  }

  public static double[] logRandom(Random rand, double lowerLimit,
      double upperLimit, int count) {
    double[] result = new double[count];
    double logLower = Math.log(lowerLimit);
    double logUpper = Math.log(upperLimit);
    for (int i = 0; i < count; i++) {
      double raw = rand.nextDouble();
      result[i] = Math.exp(raw * (logUpper - logLower) + logLower);
      if (result[i] < lowerLimit) {
        result[i] = lowerLimit;
      } else if (result[i] > upperLimit) {
        result[i] = upperLimit;
      }
    }
    Arrays.sort(result);
    return result;
  }

}

暫無
暫無

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

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