微信红包的实现

封装一个微信用包类,主要的功能有|:

红包中存有钱,多少个人分;每个分到的钱数,及获收红包的时间;

主要的功能有

打开红包;(如果打开红包的人数没有达到上限,则可以打开,并随机获得金额)

查看红包分配信息;

设置截止日期;(如果超过最大金额,则再打时提示过期)

思路:微信红包类应该具有的属性有红包金额,红包数,过期时间,领红包的人,时间等。

难点在于:将红包如何分成几份,等可能的被其他人抢到,而且不会出现为0的红包。

首先运用取随机数的类,每次取当前所剩金额的随机数,然后将这些分好的红包放到数组中的,随机打乱顺序,这样取得时候就是等可能性,每个人取得时候顺序获得数组中的红包。代码实现如下:

  1 package zuoye;
  2 import java.text.SimpleDateFormat;
  3 import java.util.*;
  4 public class zuoye_3 {
  5
  6     public static void main(String[] args) {
  7         Scanner sc=new Scanner(System.in);
  8         Date t=new Date();                         //时间类,设定红包过期的时间
  9         Calendar c=Calendar.getInstance();
 10         c.setTime(t);
 11         c.add(Calendar.HOUR, 2);                   //2小时后过期
 12         System.out.println("请输入红包金额:");
 13         double n=sc.nextInt();
 14         System.out.println("请输入红包的数量:");
 15         int x=sc.nextInt();
 16         Money hong=new Money(n,c.getTime(),x);     //传递参数,红包金额,红包数,时间
 17         //sc.next();
 18         System.out.println("请输入抢红包的人的名字:");
 19         for(int i=0;i<x;i++)
 20         {  people ob1=new people(sc.next());         //创建几个人进行抢
 21            Date t1=new Date();
 22           hong.qiang(ob1,t1);
 23         }
 24         hong.show();
 25     }
 26
 27 }
 28 class Money{
 29     private double money;           //红包金额
 30     private Date time;              //到期时间
 31     private int size;               //红包数
 32     private int num;                //第几个人在抢
 33     private double nowmoney;        //红包剩余金额
 34     ArrayList<Double> str=new ArrayList<Double>(); //红包被分为存取随机金额
 35     ArrayList<people> p=new ArrayList<people>();   //抢红包的人
 36     public Money(double money, Date time, int size) {
 37         super();
 38         this.money = money;
 39         this.time = time;
 40         this.size = size;
 41         nowmoney=money;
 42         yao();
 43     }
 44     /*
 45      * 将红包分为随机金额存到数组中,并处理如果金额为0时的情况,最后打乱顺序
 46      */
 47     private void yao()
 48     {  double m=nowmoney;
 49         for(int i=1;i<=size;i++)
 50         {
 51             if(i==size)
 52              {str.add(m);
 53                m=0;
 54              }
 55             else
 56             {
 57                 Random r=new Random();
 58                 double x=0;
 59                 if(m!=0)
 60                 x=r.nextDouble()*m;
 61                 m-=x;
 62                 str.add(x);
 63             }
 64         }
 65         Collections.sort(str);
 66         for(int i=0;i<str.size();i++)
 67         {
 68             if(str.get(i)<0.005)
 69             {
 70                 double x=str.get(size-1)*0.01;
 71                 str.set(i,x+str.get(i));
 72                 str.set(size-1,str.get(size-1)-x);
 73             }
 74             else
 75             {
 76                 break;
 77             }
 78         }
 79         Collections.shuffle(str);
 80     }
 81     /*
 82      * 抢红包操作,参数为人和时间
 83      */
 84     void qiang(people ob,Date t){
 85         num++;
 86         if(num>size)
 87         {
 88             System.out.println("红包已经抢完了");
 89             return ;
 90         }
 91         if(t.after(time))
 92         {
 93             System.out.println("红包已经过期了");
 94             return ;
 95         }
 96             ob.money=str.get(num-1);
 97             ob.time=t;
 98             nowmoney-=ob.money;
 99             p.add(ob);
100             if(num==size)
101                 nowmoney=0;
102     }
103     /*
104      * 显示当前红包情况,被谁抢,什么时候,剩余多少
105      */
106     void show()
107     {
108         Collections.sort(p);
109         System.out.print("红包共"+this.money+"元,已有"+p.size()+"人抢,现在剩余");
110         System.out.printf("%.2f\n",this.nowmoney);
111         SimpleDateFormat c=new SimpleDateFormat("h:mm:ss");                   //设定日期的输出格式
112         for(int i=0;i<p.size();i++)
113         {
114             System.out.print(p.get(i).name+"抢到");
115             System.out.printf("%.2f",p.get(i).money);
116             System.out.println("  时间"+c.format(p.get(i).time));
117         }
118     }
119 }
120 class people implements Comparable<people>{
121     String name;
122     double money;
123     Date time;
124     public people(String name) {
125         super();
126         this.name = name;
127     }
128     @Override
129     public int compareTo(people o) {
130
131         return (int)(o.money-this.money);
132     }
133
134 }
时间: 2024-10-20 15:20:12

微信红包的实现的相关文章

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢) 概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.. 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低. 实时性:为什么明明抢到红包,点开后发现没有? 答:2014年的红包一点开就知道金额,分两次操作

微信红包随机算法

最近看了一篇文章,讲微信红包随机算法的.感觉很不错,所以自己实现了下,并进行了简单测试. 算法 算法很简单,不是提前算好,而是抢红包时计算: 红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间. 实现 实现上述算法的逻辑主要是: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_red

壕,微信6.1版发微信红包更方便了,我们去喝杯茶吧

微信6.1版发布了,附件栏就能发微信红包,壕们,我们出去喝喝茶吧,探讨一下如何搜索朋友圈和附近商家,顺便谈谈理想聊聊人生. 微信6.1 For iOS正式登陆APP Store,除了强化红包功能外,还加入了自定义表情漫游以及搜索朋友圈的内容和附近的餐馆等新功能. 具体更新说明: - 现在可以通过附件栏发微信红包了 - 更换手机时,自定义表情不会丢失 - 可以搜索朋友圈的内容和附近的餐馆

2015年随微信红包即将爆发!

2015年1月的消息,微信即将升级的6.1版本中会出现摇一摇的红包和卡券的功能.此功能意味着,将来“摇一摇”除了寻找朋友,还会成为连通线上和线下的桥梁.在这里一个不可忽视的技术概念是“iBeacon技术”. iBeacon是苹果公司2013年6月推出的技术,并在9月发布的移动设备上配备了此新功能:通过蓝牙(BLE)进行精准定位,当智能设备靠近iBeacon信标时,设备能感应到iBeacon信号,商家因此能为消费者提供基于位置的相关信息,在适当的时间和地点向用户推送所需要的信息. 这是一个简单的场

微信红包金额分配的算法 http://timyang.net/architecture/wechat-red-packet/

虽然春节已经过去一段时间,但不少微信群里面依旧乐此不疲的在玩发红包活动,用户自发的将最初的一个春节拜年的场景功能慢慢演化成一个长尾功能. 用户在微信中抢红包时分成抢包和拆包两个操作.抢包决定红包是否还有剩余金额,但如果行动不够迅速,在拆包阶段可能红包已经被其他用户抢走的情况. 红包的金额是在什么时候算? 据某架构群腾讯财付通专家反馈,红包的金额是拆的时候实时计算,而不是预先分配,实时计算基于内存,不需要额外存储空间,并且实时计算效率也很高.每次拆红包时,系统取0.01到剩余平均值*2之间作为红包

微信红包生成算法 (解)

/** * 微信红包生成算法 * * @param int $total 红包金额 * @param int $num 拆分数量 * @param int $min 拆分的红包最小金额数目 */function set_packet($total, $num, $min = 0.01){ for ($i = 1; $i < $num; $i++) { //随机安全上限 $safe_total = ($total-($num-$i)*$min)/($num-$i); //红包金额 $money =

(实用篇)php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class WxApi { const appId = ""; const appSecret = ""; const mchid = ""; //商户号 const privatekey = ""; //私钥 public $parame

微信红包资本论

“ 微信红包告诉你什么是资本运作.仅仅2天时间微信绑定个人银行卡2亿张,干了支付宝8年的事.若30%的人发100元红包,共形成60亿的资金流动,延期一天支付,民间借贷目前月息2%,每天保守收益就420万元,若30%用户没选择领取现金,那么其账户可以产生18亿的现金沉淀,无利息…这才是资本游戏. ” 新年刚过,红包大战硝烟未远,网上一则消息开始流行.根据查阅的资料从以下方面进行分析: 1.绑定卡的数量和资金 中国共计13亿人,平均每6个人就有一个绑定微信支付,这是不可能的数字.30%的人发红包也只

对微信红包的一些看法

包括: 一.喜欢微信红包的主要原因 二.个人觉得的亮点和不足的地方 三.从微信红包中的一些感悟 个人只有大年30,大年初一两天和这些红包接触多点,谈下个人的感想吧. 微信红包: 个人比较喜欢这个. 一.喜欢的主要原因: 1.习惯用微信和朋友交流. 2.微信红包做得不是特别的差,该有的功能都有. 总的来说,个人觉得我用微信红包不是因为微信红包做得好,而是微信做得好. 二.亮点和不足的地方: 亮点:什么是亮点,用户觉得好的地方就是亮点.目前个人用还未发现,只能说,该有的都有,一个红包也起码应该这样.