java 简单模拟抢红包

来源:互联网 发布:大连知行中学乒羽中心 编辑:程序博客网 时间:2024/04/30 01:10

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

思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是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,结果如下:
这里写图片描述

0 0
原创粉丝点击