java 抢红包的随机钱数分配问题

抢红包是钱数都是随机的,要写出完全是凭运气的代码才行

思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是5个人,抢10块钱

    1,首先生成5个随机数,然后利用每个随机数在5个随机数中所占的比例分配钱数。
    2,首先生成4个随机数,然后排序,将这4个随机数放在0~10块的坐标上,截取5段,这5段就是钱数。

当然,还得考虑一个问题,钱数是两位小数的,且最少的钱也是0.01;这就可能麻烦点了。
写的是第一种方法的代码,第二种以后再写,比较完整的抢红包也会在之后写,这之中还用到了double类型的加减法,需要BigDecimal类,在上一篇已经介绍:

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class TestMoney {

    public static void main(String[] args) {
        int num = 999;
        double money = 10;
        List<Double> array = new ArrayList<>();
        Random r = new Random();
        double sum = 0;
        for (int i = 0; i < num; i++) {
            array.add(r.nextDouble()*money + 0.01 * num * money);//经过小小的计算,这样使最小的钱尽量接近0.01;num越大,此计算越没有用
            sum += array.get(i);
        }
        for (int i = 0; i < array.size(); i++) {
            array.set(i, array.get(i) / sum*money);
        }
        Collections.sort(array);
        //double z=1.0*money;
        for (int i = 0; i < array.size(); i++) {//将钱进行分配;
            if(array.get(i)<=0.01){//不足0.01的直接给0.01;
                //z-=0.01;
                array.set(i, 0.01);
            }
            else if(i==array.size()-1){
                //array.set(i, (int)(z*100)*1.0/100);//将剩余的一点money给最后一个人,因为排序,最后一个人最大份,所以最后分配的肯定是正数
                BigDecimal he =new BigDecimal("0");
                for(int j=0;j<array.size()-1;j++){
                    BigDecimal b =new BigDecimal(Double.toString(array.get(j)));
                    he=he.add(b);
                }
                BigDecimal moneyb =new BigDecimal(Double.toString(money));
                array.set(i, moneyb.subtract(he).doubleValue());
            }
            else{
                array.set(i, (int)(array.get(i)*100)*1.0/100);
                //z-=array.get(i);
            }
        }
        Collections.shuffle(array);
        for(Double a:array){
            System.out.println(a);
        }
        //System.out.println(array.contains(0.02));
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值