java 简单模拟抢红包2
2016-10-01 13:17
405 查看
抢红包是钱数都是随机的,要写出完全是凭运气抢红包的代码才行
思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是5个人,抢10块钱
写的是第二种方法的代码:
思想:肯定是要利用随机数的,大概一想,是这么个回事。那么,怎么利用随机数做到公平了,想到两种比较好的办法,假如是5个人,抢10块钱
1,首先生成5个随机数,然后利用每个随机数在5个随机数中所占的比例分配钱数。 2,首先生成4个随机数,然后排序,将这4个随机数放在0~10块的坐标上,截取5段,这5段就是钱数。
写的是第二种方法的代码:
import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; public class WeChatLucyBag { private int bagNum; private double totalMoney; private Date createDate; private long start; private long end; private List<Double> bag; private Map<String,Double> info; public WeChatLucyBag(int bagNum,double totalMoney){ this.bagNum=bagNum; this.totalMoney=totalMoney; int tm=(int)(totalMoney*100); if(tm>20000){ this.throwError("红包金额过大"); } if(tm<=0){ this.throwError("你玩我呢??!"); } if(tm<bagNum){ this.throwError("单个红包不能小于1分"); } //判断 一个包的情况 { bag=new ArrayList<>(); info=new HashMap<>(); createDate=new Date(); } if(bagNum==1){ bag.add((totalMoney*100-0)/100.00); System.out.println(bag); } else{ //有一个集合存储随机数 List<Integer> list=new ArrayList<>(); Random r=new Random(); while((bagNum-1)>list.size()){ int temp=r.nextInt(tm-2)+1; if(!list.contains(temp)){ list.add(temp); } } Collections.sort(list); bag.add((list.get(0)-0)/100.00); for(int i=1;i<list.size();i++){ bag.add((list.get(i)-list.get(i-1))/100.00); } bag.add((tm-list.get(list.size()-1))/100.00); System.out.println(list); } } private void throwError(String text){ throw new RuntimeException(text); } //分包 开包 检查 打印信息 public void open(String name){ if(bagNum==bag.size()){ start=System.currentTimeMillis(); } if(bagNum==0){ end=System.currentTimeMillis(); System.out.println("一共用了"+(end-start)/1000+"秒"); } if(createDate.after(new Date(System.currentTimeMillis()-86400000))){ if(bagNum!=0){ double money=bag.get(--bagNum); System.out.println("恭喜你 抢到了"+money+"元"+'\n'); info.put(name,money); }else{ System.out.println("你手速慢了 红包都没啦"); showInfo(); } }else{ System.out.println("红包过期"); } } public void showInfo(){ for(Entry<String,Double> entry:info.entrySet()){ System.out.println(entry.getKey()+"抢到了"+entry.getValue()+"元"); } System.out.println(); } public static void main(String[] args) { WeChatLucyBag wb=new WeChatLucyBag(3,2); wb.open("haha"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } wb.open("heihie"); wb.open("gaga"); wb.open("kaka"); wb.open("guagua"); } }
相关文章推荐
- JAVA实现简单抢红包算法(模拟真实抢红包)
- java 简单模拟抢红包
- JAVA实现 简单抢红包算法,模拟真实抢红包。
- 手机模拟触摸板的简单实现Java版
- java利用注解模拟简单的ORM
- 使用java简单模拟ping和telnet的实现
- java多线程之生产者与消费者问题的简单模拟
- 使用java简单模拟ping和telnet的实现
- java简单模拟生产者消费者问题
- 简单模拟多线程Socket通信(java)
- Java模拟登录WEB系统的简单示例
- java模拟链表和栈以及简单实现
- Java: 简单模拟多线程访问同样变量导致的问题
- 从拼图游戏开始(一)_简单java模拟
- java动态代理原理及简单模拟
- Java反射及依赖注入简单模拟
- 使用java简单模拟ping和telnet的实现
- 使用java简单模拟ping和telnet的实现
- java网络编程一:Socket用法,简单模拟一对一聊天
- 编写Java程序,模拟简单的计算器。 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有。 编写构造方法,用于初始化n1和n2,再为该类定义 加(addition)、 减(su