模拟微信红包随机金额生成

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]);
    }
}
  • 总结一下:上述的方法的确初步地实现了随机数额的生成,但是随着totalpiece参数的变化可能存在数组最后一个元素的数值大小尤为突出的情况,需要手动调整前piece-1个随机数的生成逻辑,所以严格来讲,并不是很理想,还存在优化的空间,期待后面自己有新的idea能够改进下这个逻辑…