Java 如何使用有偏权重在x个变量之间划分总值1

Java 如何使用有偏权重在x个变量之间划分总值1,java,math,Java,Math,我的任务是解决一个我不太确定如何用数学方法解决的问题 我试图创建一个将int数组作为参数的方法。数组的长度将发生变化,但永远不会为零。数组中的值并不重要,因为该方法将用下面确定的值覆盖它们 该方法的目的是在阵列中的每个位置之间总共除以1.0。这一点很简单,但另一个复杂性是,这种划分应该是有偏见的。左侧的值应高于右侧的值,请参见下面的输出示例 例如,传递一个大小为7的int数组。我希望输出类似于: [3,25,15,1,09,07,0.04] 其中所有值之和=1 我正在使用Java,但即使是伪代码

我的任务是解决一个我不太确定如何用数学方法解决的问题

我试图创建一个将int数组作为参数的方法。数组的长度将发生变化,但永远不会为零。数组中的值并不重要,因为该方法将用下面确定的值覆盖它们

该方法的目的是在阵列中的每个位置之间总共除以1.0。这一点很简单,但另一个复杂性是,这种划分应该是有偏见的。左侧的值应高于右侧的值,请参见下面的输出示例

例如,传递一个大小为7的int数组。我希望输出类似于:

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

其中所有值之和=1


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

您没有详细说明您要寻找的偏差或分布,但针对偏差非均匀分布的简单方法是:


从[0,1]中画出第一个数字a1,从[0,1-a1]中画出第二个数字a2,从[0,1-a1-a2]中画出第三个数字a3,依此类推。将a设置为当前总数的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中减去其他值来重新计算最新值,以最小化舍入误差。这取决于你所要求的精度。 如果您需要精确的值,您不能使用double,请使用int,就像我们使用货币一样

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;
}
通过降序进行的偏置。 通过将Random.next的和除以0和1实现的和1.0, 加上一个ε不等于零。 对于最小浮点错误,请将第一个元素更正为1.0-其余元素的和。
对于7个位置,除以8,则第一个位置为2*1/8,所有其他位置为1/8。这只会使第一个值有偏差。我需要它们都是不同的,左边最高,右边最低。你没有在你的问题中指定值也必须是随机的吗?我更新了问题来澄清。这些值是随机的,只要它们的和都等于1,那么取数组元素的和,然后将每个元素除以它怎么样?这样就得到了均匀分布。偏见在哪里?只有订单吗?