我会生成一个唯一的随机数列表,然后通过将它们全部除以它们的和来对其进行归一化。
然后排序并反转您的列表。
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