微信红包怎么实现

群里都在玩抢红包,抢了再发,发了再抢,简直是无聊,程序员感兴趣是的如何实现,这里简单说说实现思路,附上dome,代码有点low,好在是实现了
比如:
100块发30个红包========
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1块发10个红包========
在这里插入图片描述
1块发10个红包========
在这里插入图片描述

=========================================================

发红包需要满足以下几个条件

1.总金额不变

2.每个红包都必须有钱

3.尽量的均匀点,不然抢红包没什么意思了

=========================================================

实现思路

1.首先要确定最小单位,这里是精确到分,我这里以int类型进行计算,得出的结果也全是int类型

2.数据均匀,这里以 1<n<(剩余金额/剩余红包数)*2,这里防止一个红包抢走大量的钱,这里需要写个递归,去检查数据值是否过大,50元发13个红包的第3图,就是因为没有检查数据,导致钱不平均,这个可以根据自己的玩法去设置.

3.余数处理,当数据平均给20个红包,肯定跟总金额有所偏差,这时候我们就要多退少补,如果大于总金额,让红包金额多的去减少(总金额/总人数),如果还有剩余,就让第二多的去减少,直到补完这个空缺为止,反之亦然.

4.打乱顺序,细心的园友可能发现,红包是有顺序规律的,我们必须简单的写个function去打乱它.

=========================================================

demo

 /// <summary>
            /// 抢红包
            /// </summary>
            /// <param name="money"></param>
            /// <param name="num"></param>
            /// <returns></returns>
            public List<int> qhb(int money, int num)
            {
                int min = 1;
                int pjs = money / num;
                List<int> list = new List<int>();
                Random rnd = new Random();
                for (int i = 0; i < num; i++)
                {
                    int max = (money / (num - i)) * 2;
                    int s = rnd.Next(min, max);
                    s = checkmoney(s, min, max);
                    list.Add(s);
                    money -= s;
                }
                //前面数据都是合理的,结尾必须多退少补
                list = checklist(money, pjs, list);
                return list;
            }


    /// <summary>
            /// 获取到合理数据
            /// </summary>
            /// <param name="i"></param>
            /// <param name="min"></param>
            /// <param name="max"></param>
            /// <returns></returns>
            public int checkmoney(int i, int min, int max)
            {
                if (i > max || i < min)
                {
                    Random rnd = new Random();
                    i = rnd.Next(min, max);
                    return checkmoney(i, min, max);
                }
                return i;
            }




/// <summary>
        /// 余数处理
        /// </summary>
        /// <param name="money"></param>
        /// <param name="list"></param>
        /// <returns></returns>
        public List<int> checklist(int money, int pjs, List<int> list)
        {
            if (money != 0)
            {
                if (money > 0)
                {

                    List<int> list_order = maopao(list);
                    //给最小
                    if (money / pjs == 0)
                    {                      
                        list_order[0] += money;
                    }
                    else
                    {
                        for (int i = 0; i < money / pjs + 1; i++)
                        {
                            if (i == money / pjs)
                            {
                                list_order[i] += (money - (money / pjs) * pjs);
                            }
                            else
                            {
                                list_order[i] += pjs;
                            }

                        }
                    }
                    return list_order;
                }
                else
                {

                    List<int> list_order = maopao(list,"desc");
                    //给最大
                    if (money / pjs == 0)
                    {

                        list_order[0] += money;
                    }
                    else
                    {
                        for (int i = 0; i < -(money / pjs) + 1; i++)
                        {
                            if (i == -(money / pjs))
                            {
                                list_order[i] += (money - (money / pjs) * pjs);
                            }
                            else
                            {
                                list_order[i] -= pjs;
                            }

                        }
                    }
                    return list_order;
                }
            }
            return list;
        }




/// <summary>
        /// 冒泡排序
        /// </summary>
        /// <param name="list"></param>
        /// <param name="order"></param>
        /// <returns></returns>
        public List<int> maopao(List<int> list,string order = "asc")
        {
            if (order != "asc")
            {
                for (int i = 0; i < list.Count; i++)
                {
                    for (int j = 0; j < list.Count - i - 1; j++)
                    {
                        if (list[j + 1] > list[j])
                        {
                            int temp = list[j];
                            list[j] = list[j + 1];
                            list[j + 1] = temp;

                        }
                    }
                }
            }
            else 
            {
                for (int i = 0; i < list.Count; i++)
                {
                    for (int j = 0; j < list.Count-i-1;j++)
                    {
                        if (list[j+1] < list[j])
                        {
                            int temp = list[j];
                            list[j] = list[j+1];
                            list[j+1] = temp;

                        }
                    }
                }
            }
            return list;
        }




/// <summary>
        /// 打乱顺序
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public List<int> suiji(List<int> list) 
        {
            Random rnd = new Random();
            for (int i = 0; i < list.Count; i++)
            {
                int temp = list[i];
                int j = rnd.Next(0, list.Count-1);
                list[i] = list[j];
                list[j] = temp;
            }
            return list;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值