模拟微信红包随机金额生成
2022-11-10
预计阅读时间:2分钟
如题,初步思路如下:
方法形参:总金额total
,红包数piece
逻辑:产生红包数-1
组随机数,最后一个红包的金额又剩余的金额填充
确定逻辑完成,下面是完整的编码实现:
public void randomDivide(int total, int piece){
//初始化产生的piece-1份随机数的总和
double cost = 0;
//初始化存放结果的数组,初始化空间大小与红包数量相等
double[] result = new double[piece];
for (int i = 0; i < piece-1; i++) {
/** Math.random()默认产生(0,1)范围的随机数
* "Math.random()*total/piece"这部分可以根据产生数据的实际情况进调整,可以使随机数之间的差值不过分夸张
* 这里使用String.format(String ,Object)对生成的double类型随机数限制需要的精度,返回值为String
* 限制double精度完成后,再使用double的包装类Double的parseDouble()方法将限制精度后的随机数字符串转换为double类型并赋值给第i个元素
**/
result[i] = Double.parseDouble(String.format("%.2f",Math.random()*total/piece));
cost += result[i];
}
//将产生piece-1个随机数结束后的余数赋给数组最后一个元素
result[piece-1] = Double.parseDouble(String.format("%.2f",total - cost));
//打印结果
for (int i = 0; i < piece; i++) {
System.out.printf("第%d个随机数值为%.2f\t", i+1, result[i]);
}
}
- 总结一下:上述的方法的确初步地实现了随机数额的生成,但是随着
total
和piece
参数的变化可能存在数组最后一个元素的数值大小尤为突出的情况,需要手动调整前piece-1
个随机数的生成逻辑,所以严格来讲,并不是很理想,还存在优化的空间,期待后面自己有新的idea能够改进下这个逻辑…