如何在偏重的x变量之间除以1的总值

我面临的一个问题是我不确定如何数学求解。

我正在尝试创建一个将int数组作为参数的方法。数组的长度会有所不同,但永远不会为零。数组中的值并不重要,因为该方法将使用下面确定的值覆盖它们。

该方法的目的是在数组的每个位置之间总计1.0。这很简单,但是另外的复杂性是应该对划分有偏见。左侧的值应高于右侧的值(请参见下面的示例输出)。

一个示例将传递一个大小为7的int数组。我期望输出类似于:

  

[。3,.25,.15,.1,.09,.07,0.04]

其中所有值的总和= 1

我正在使用Java,但即使是伪代码也会有所帮助!

q791656449 回答:如何在偏重的x变量之间除以1的总值

我会生成一个唯一的随机数列表,然后通过将它们全部除以它们的和来对其进行归一化。

然后排序并反转您的列表。

int n = 7;

// make a list of n unique random numbers 
double[] randomValues = new Random().doubles(0,1).distinct().limit(n).toArray();

// normalize the list and reverse sort it
double sum = Arrays.stream(randomValues).sum();
List<Double> array = Arrays.stream(randomValues).boxed()
        .map(d -> d/sum)
        .sorted(Comparator.reverseOrder())
        .collect(Collectors.toList());

您的数组现在应该具有总计为1的随机值,以相反的顺序排序

注意事项:

您可能希望通过从1中减去其他值来实际重新计算最新值,以最大程度地减少舍入误差。这取决于您需要的精度。 如果需要确切的值,则不能使用双精度,而可以使用整数(就像我们使用货币一样)。

,

您没有确切指定要寻找的偏倚或分布,但是偏向不均匀分布的直接方法是:

a1绘制第一个数字[0,1],从a2绘制第二个数字[0,1-a1],从a3绘制第三个数字[0,1-a1-a2]等等。将an设置为当前总数的1的补数,然后对所有内容进行排序。

,
double[] distributeDecreasing(int n) {
    Random random = new Random();
    double[] values = new double[n];
    final double nEps = 0.0001 * n;
    double sum = 0.0;
    for (int i = 0; i < n; ++n) {
        double value = nEps + random.next();
        sum += value;
        values[i] = value;
    }
    double sumFrom1 = 0.0;
    for (int i = 1; i < n; ++n) {
        values[i] /= sum;
        sumFrom1 += values[i];
    }
    if (n > 0) {
        values[0] = 1.0 - sumFrom1;
    }
    Arrays.sort(values,Comparator.reverseOrder());
    return values;
}
  • 通过降低顺序来完成偏向。
  • 总和1.0通过将Random.next的总和(在0和1之间)除以, 加上一个不为零的epsilon。
  • 为使浮点误差最小,请将第一个元素更正为1.0-其余元素之和。
本文链接:https://www.f2er.com/3160524.html

大家都在问