【发布时间】:2012-04-05 02:12:00
【问题描述】:
我正在尝试生成一个整数数组,其中包含随机数加起来一个特定的值。这是我的代码:
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;
}
但是,结果并不准确,例如:
找不到 4194304 的 100 个数字。最终总和 = 4194305.0
我认为我在这方面失去了准确性:
(sum * ret[i]) / iniSum
您能否在我的代码中推荐一种替代算法或修复方法来帮助我实现这一目标?
【问题讨论】:
-
是每次都抛出同一个异常,还是多次运行程序时异常不同?
-
“我正在尝试生成一个整数数组,其中包含随机数加起来一个特定的值。”(抓挠头)这是否意味着至少有一个集合中的值不是随机的?
-
@AndrewThompson 笑得很开心!
-
不管怎样,单元测试不应该有随机行为。他们应该有专门设计的行为来测试特定案例。
-
@QuantumMechanic: 取
n随机数(任意范围,只要分布均匀),求和,再除以总和就是从[0,1]生成n随机“公平”数字的标准方法,总和为1。很明显,将它们全部乘以另一个数字k将为您提供n来自[0,k]的随机“公平”数字.
标签: java math random precision