java 简单模拟抢红包

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

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

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

当然,还得考虑一个问题,钱数是两位小数的,且最少的钱也是0.01;这就可能麻烦点了。 写的是第一种方法的代码:

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

public class LuckyBag {
    private int sumnum=0;//已抢的红包数
    private int num=0;//红包总数
    private double maxLucky=0;//手气最佳的钱数
    private String maxLuckyPerson="";//运气王
    private long start;//发红包的开始时间
    private long endtime=10000;//红包有效时间
    private double money;//红包钱数
    private List<Double> array = new ArrayList<>();//红包随机分配的list
    public LuckyBag(int num,double money){
        this.num=num;
        this.money=money;
        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());
                maxLucky=Math.max(array.get(i),array.get(i-1));
            }
            else{
                array.set(i, (int)(array.get(i)*100)*1.0/100);
                //z-=array.get(i);
            }
        }
        Collections.shuffle(array);
        start=System.currentTimeMillis();
//      for(Double a:array){
//          System.out.println(a);
//      }
//      System.out.println(array.contains(0.02));
    }
    public void getBag(String name){
        if(sumnum<num)
        {
            long time=System.currentTimeMillis();
            if(time-start>=endtime){
                System.out.println("红包已过期!");
                return;
            }
            if(array.get(sumnum)==maxLucky){
                maxLuckyPerson=name;
            }
            System.out.println("  "+name+"抢了"+array.get(sumnum)+"元");
            sumnum++;
        }
        else{
            System.out.println("  红包已被抢完"+'\n'+"     运气王是"+maxLuckyPerson+" 抢了"+maxLucky+"元");
        }
    }
    public static void main(String[] args) {
        LuckyBag lb=new LuckyBag(5,10.0);
//      lb.getBag("java");
//      try {
//          Thread.sleep(3000);
//      } catch (InterruptedException e) {
//          e.printStackTrace();
//      }
//      lb.getBag("java2");
        String [] name={
                "java","java2","java3","java4","java5","java6","java7","java8"
        };
        System.out.println("共"+lb.money+"元"+"   "+lb.num+"个");
        for(int i=0;i<name.length;i++){
            lb.getBag(name[i]);
            Random r=new Random();
            try {
                Thread.sleep(r.nextInt(3000));//模拟抢红包的过程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

这里写图片描述

把代码中的endtime设为5000,结果如下:
这里写图片描述

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值