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
- java 简单模拟抢红包
- JAVA实现 简单抢红包算法,模拟真实抢红包。
- java 简单模拟抢红包2
- Java模拟抢红包应用
- 多线程模拟抢红包
- 使用java简单模仿抢红包功能
- java 模拟QQ拼手气红包
- java 抢红包算法
- java生成红包的简单算法
- 简单随机红包生成java实现
- java抢红包功能实现
- Java抢红包小程序
- java多线程实现抢红包
- 抢红包的红包生成算法Java实现代码
- 模拟微信红包
- C4top-抢红包 (模拟-结构体排序)
- Java简单模拟ping
- socket简单java模拟
- Dubbo各种协议
- Linux默认编辑器vi/vim的用法
- [leetcode][easy]263. Ugly Number
- Web应用架构演进及系统性能、稳定性所需要解决的问题
- 栈的实现(顺序结构&&链式结构)
- java 简单模拟抢红包
- 6. ZigZag Conversion
- Swift 学习第一天
- 云计算理论基础
- 关于快照隔离和幻影读的一些深入思考
- poj3255 Roadblocks--次短路spfa
- 【牛客网】马三来刷题之串的模式匹配
- java 简单模拟抢红包2
- 继承方式实现对目标对象的方法增强