fec*_*eco 3 java random algorithm sum
因此,我的想法是能够将2.00美元分成10个人,并且每个人将随机获得$ x.xx金额.(N和M将始终限制为2位小数且> 0)
例:{0.12,0.24,1.03,0.01,0.2,0.04,0.11,0.18,0.05,0.02}
目前我尝试过:
private static BigDecimal[] randSum(int n, double m)
{
Random rand = new Random();
BigDecimal randNums[] = new BigDecimal[n], sum = new BigDecimal(0).setScale(2);
for (int i = 0; i < randNums.length; i++)
{
randNums[i] = new BigDecimal(rand.nextDouble()).setScale(2, RoundingMode.HALF_EVEN);
sum = sum.add(randNums[i]);
}
for (int i = 0; i < randNums.length; i++)
{
BigDecimal temp1 = randNums[i].divide(sum, 2, RoundingMode.HALF_EVEN);
BigDecimal temp2 = temp1.multiply(new BigDecimal(m).setScale(2));
randNums[i] = temp2;
}
return randNums;
}
public static void main(String[] args)
{
BigDecimal d[] = randSum(5, 2);
double sum = 0;
for (BigDecimal n : d)
{
sum += n.doubleValue();
System.out.println(n);
}
System.out.println("total: " + sum);
}
Run Code Online (Sandbox Code Playgroud)
但BigDecimals太混乱了,他们没有加起来.有时总数是1.98或2.01.由于Double-precision浮点数,双打不起作用.
代码取自:
假设你需要一个固定的精度(作为prec参数传递):
static public BigDecimal[] split(BigDecimal sum, int prec, int count) {
int s = sum.scaleByPowerOfTen(prec).intValue();
Random r = new Random();
BigDecimal[] result = new BigDecimal[count];
int[] v = new int[count];
for (int i = 0; i < count - 1; i++)
v[i] = r.nextInt(s);
v[count - 1] = s;
Arrays.sort(v);
result[0] = BigDecimal.valueOf(v[0]).scaleByPowerOfTen(-prec);
for (int i = 1; i < count; i++)
result[i] = BigDecimal.valueOf(v[i] - v[i - 1]).scaleByPowerOfTen(-prec);
return result;
}
Run Code Online (Sandbox Code Playgroud)
此方法使用Random.nextInt()均匀分布的属性.排序后,v[]数组的值是分割整个数量的点,因此您可以使用相邻元素之间的差异生成结果:
[ 2, 5, 10, 11, ..., 197, 200] // v[]
[0.02, 0.03, 0.05, 0.01, ..., ..., 0.03] // result[]
Run Code Online (Sandbox Code Playgroud)
在这里,您使用整数值进行操作,因此舍入问题不再困扰.