gpt4 book ai didi

java - 将给定的数字 M 随机分成 N 份

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:24:13 24 4
gpt4 key购买 nike

所以,我的想法是,能够将 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);
}

但是 BigDecimals 太困惑了,它们不相加。有时总数是 1.98 或 2.01。由于 double float , double 不起作用。

代码取自:

Getting N random numbers that the sum is M

最佳答案

假设您需要固定精度(作为 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;
}

此方法使用 Random.nextInt() 均匀分布的属性。排序后,v[] 数组的值是整个数量被分割的点,因此您使用相邻元素之间的差异生成结果:

[   2,    5,   10,   11, ...,  197,  200]  // v[]
[0.02, 0.03, 0.05, 0.01, ..., ..., 0.03] // result[]

此处您使用整数值进行运算,因此舍入问题不再困扰。

关于java - 将给定的数字 M 随机分成 N 份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32135776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com