两个双重之间的随机偶数对数分布

时间:2014-11-22 06:32:17

标签: java algorithm random logarithm exponential

也许我在想这个,但我正试图找到一种很好的方法来获得两个均匀对数分布的点之间的随机数。 假设我有两个界限0.001和1000,我想找到6个对数均匀分布的随机数。所以这些数字:0.002,0.033,0.543,1.634,34.673,765.234 ...现在说我正在寻找7个随机数,它们也会在这个范围内大致均匀排序......我正在使用爪哇

1 个答案:

答案 0 :(得分:0)

这是你想要的吗?我将数字均匀分布在由限制日志形成的范围内,然后使用Math.exp转换回实际范围。我对结果数组进行了排序,因为您的示例显示了排序数如果您不想要,请删除Arrays.sort调用。

为简单起见,我跳过了边界检查。据推测,0 <0。 lowerLimit&lt; 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;
  }

}