private long[] getRandoms(long size , long sum) throws Exception {
double iniSum = 0;
System.out.println("sum = " + sum);
long[] ret = new long[(int) size];
for (int i = 0 ; i < ret.length; i++) {
ret[i] = randomInRange(1, sum);
iniSum += ret[i];
}
double finSum = 0;
for (int i = 0 ; i < ret.length; i++) {
ret[i] = Math.round((sum * ret[i]) / iniSum);
System.out.println("ret[" + i +"] = " + ret[i]);
finSum += ret[i];
}
if (finSum != sum) throw new Exception("Could not find " + size + " numbers adding up to " + sum + " . Final sum = " + finSum);
return ret;
}
private long randomInRange(long min , long max) {
Random rand = new Random();
long ret = rand.nextInt((int) (max - min + 1)) + min;
System.out.println("ret = " + ret);
return ret;
}
然而,结果不准确,例如:
我认为这一部分失去了精度。无法找到100个数字相加等于4194304。最终总和为4194305.0。
(sum * ret[i]) / iniSum
你能否推荐一种替代算法或修复我的代码,以帮助我实现这个目标?
n
个随机数(在任何范围内,只要分布均匀),将它们相加,然后将它们全部除以总和是生成n
个随机“公平”数字的标准方法,这些数字从[0,1]
中选择,其总和为1。显然,将它们乘以另一个数字k
将给您n
个随机“公平”数字,这些数字来自[0,k]
。 - BlueRaja - Danny Pflughoeft