2014-11-22 54 views
0

也許我在想這個,但我試圖找到一個很好的方法來獲得均勻對數分佈的兩點之間的隨機數。 假設我有兩個界限0.001和1000,我想找到6個對數均勻分佈的隨機數。所以這些數字如:0.002,0.033,0.543,1.634,34.673,765.234 ......現在說我正在尋找7個隨機數字,他們會在這個範圍內大致均勻排序......我正在使用Java隨機雙偶數之間的對數分佈

+0

你可以用-3.0和3.0之間的均勻分佈生成隨機數嗎? – Beta 2014-11-22 06:36:13

+0

這不是簡單的...(-3.0 +(3.0 + 3.0)* rand.nextDouble());我可以關閉,因爲我不確定負面,但對於3.0和1.0說它會是(1.0 +(3.0 - 1.0)* rand.nextDouble()); – Matt 2014-11-22 06:48:44

回答

0

這是你想要的嗎?我將數字均勻分佈在由限制日誌形成的範圍內,然後使用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; 
    } 

} 
+0

非常感謝你......這正是我需要的,你的救星:) – Matt 2014-11-22 12:28:26