我的任务是解决一个我不太确定如何用数学方法解决的问题。
我正在尝试创建一个以 int 数组作为参数的方法。数组的长度会变化,但永远不会为零。数组中的值并不重要,因为该方法将使用下面确定的值覆盖它们。
该方法的目的是将数组中每个位置之间的总计除以 1.0。这很简单,但额外的复杂性是除法应该有偏差。左侧的值应高于右侧的值(请参阅下面的示例输出)。
一个例子是传递一个大小为 7 的 int 数组。我希望输出类似于:
[.3, .25, .15, .1, .09, .07, 0.04]
其中所有值的总和 = 1
我正在使用 Java,但即使是伪代码也会有帮助!
最佳答案
我会生成一个唯一随机数列表,然后通过将所有随机数除以它们的总和来对其进行标准化。
然后对列表进行排序和反转。
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 ,而应使用整数(就像我们处理货币一样)。
关于java - 如何使用有偏权重将 x 变量之间的总值 1 相除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58709139/