java – 将给定数字M随机分成N个部分
发布时间:2020-12-15 04:29:06 所属栏目:Java 来源:网络整理
导读:因此,我所拥有的想法是能够将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
因此,我所拥有的想法是能够将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-precision浮点数,双打不起作用. 代码取自: 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.03] // result[] 在这里,您使用整数值进行操作,因此舍入问题不再困扰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读