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