一 序

需求背景:常叫外面的同学对于美团或者饿了么的那种在微信群里分享的,第N个红包最大的领红包的营销模式很熟悉了。

我们有类似的需求,其实N是后台可以配置的。

营销规则有: 预算金额,有个范围。

第N个最大,N的范围配置。

最大金额:有个配置范围。

剩余红包金额:配置范围。

qa在测试的时候,发现按照平均数,有除不尽的case。需要重试。

思考了一下,换个思路实现拆红包的第N个最大的实现。

二 一种实现方案:

import java.util.Arrays;
import java.util.Random;import com.alibaba.fastjson.JSON;public class RedPackageTest {//小包private static final int smalllow =2;private static final int smallhigh =5;//预算private static final int[] yusuan ={30,31,32,33,34,35};//最大private static final int[] maxnum = {6,7,8};public static void main(String[] args) throws InstantiationException, IllegalAccessException {// TODO Auto-generated method stub//随机取预算int tmp= (int)Math.floor(Math.random()*yusuan.length);int yusuanNum = yusuan[tmp];//随机取最大int maxtmp= (int)Math.floor(Math.random()*maxnum.length);int maxNum = maxnum[maxtmp];//计算可用剩余金额int avlMoney = yusuanNum -maxNum;// 计算红包总数int totalnum= avlMoney/smallhigh+1;System.out.println("yusuan:"+yusuanNum+",max= "+maxNum+":num:"+totalnum);int[] result = divived(avlMoney,totalnum);System.out.println("yusuan:"+yusuanNum+",max= "+maxNum+",other redpackge reslt:"+JSON.toJSONString(result));}public static int[] divived(int money, int n) throws InstantiationException, IllegalAccessException{if(money < n* smalllow|| money> n*smallhigh ){System.out.println("超出范围,不能分配");}// 创建一个长度等于n的红包数组int[] array = new int[n];//第一步 每个红包先塞最基础的边界Arrays.fill(array,smalllow);//金额减去已分配金额money -= n*smalllow;System.out.println("before first: now left money:"+money+",array:"+JSON.toJSONString(array));for(int i=0;i<n;i++ ){        int tmp= Random.class.newInstance().nextInt(smallhigh) ;//随机取int tmpnum = tmp<smalllow?smalllow:tmp;  if( (array[i] + tmpnum)<=smallhigh){array[i] +=  tmpnum;           money -= tmpnum;//金额减去}System.out.println("fisrt reslut:tmpnum:"+tmpnum+",left money:"+money+",array:"+JSON.toJSONString(array));}System.out.println("before sec :left money:"+money+",array:"+JSON.toJSONString(array));//判断剩余未分配的金额是否大于0,分配剩余金额分散开int  j=0;while (money > 0){          if( array[j%n]<smallhigh){array[j%n] +=  1;     money = money -1;    System.out.println("sec : left money:"+money+",array:"+JSON.toJSONString(array));}         j++;}return array;       }}

对于业务规则,要求是不超预算,所以,可以一开始从预算范围随机取数,在确定最大数的数值与范围。

重点看看刨除了最大数之后,剩余的金额如何在分配范围内进行拆分。

思路是:先根据最小值进行初始化,再进行一次遍历,每次随机填充,不超过上限,对于一轮过后,有剩余的金额,再按整数进行拆分。

运行效果:

yusuan:30,max= 6:num:5
before first: now left money:14,array:[2,2,2,2,2]
fisrt reslut:tmpnum:3,left money:11,array:[5,2,2,2,2]
fisrt reslut:tmpnum:4,left money:11,array:[5,2,2,2,2]
fisrt reslut:tmpnum:2,left money:9,array:[5,2,4,2,2]
fisrt reslut:tmpnum:2,left money:7,array:[5,2,4,4,2]
fisrt reslut:tmpnum:3,left money:4,array:[5,2,4,4,5]
before sec :left money:4,array:[5,2,4,4,5]
sec : left money:3,array:[5,3,4,4,5]
sec : left money:2,array:[5,3,5,4,5]
sec : left money:1,array:[5,3,5,5,5]
sec : left money:0,array:[5,4,5,5,5]
yusuan:30,max= 6,other redpackge reslt:[5,4,5,5,5]

这个case:预算取了30,最大红包6, 剩余:24的分为5个,为:5、4、5、5、5。 复合预期。

抛砖引玉,肯定不是最优的,看看大家有更好的方案可以贴出来。

一种第N个红包最大实现的方式相关推荐

  1. 【解决方案】谈公众号红包的正确打开方式--传奇创世

    红包,红包.每次群发红包为什么只能是200?原来这是腾讯做出的一个举措.群发有红包?那如果想要微信公众号的红包怎么办? 其实,也是可以实现的.接下来的解决方案就是针对公众号红包做出的,让我们一起来看它 ...

  2. 99种用Racket说I love you的方式

    99种用Racket说I love you的方式 来源 https://www.tuicool.com/articles/qiyeAz 原文  http://www.soimort.org/posts ...

  3. 芯盾时代:一种会思考的新一代安全身份认证方式

    喂,有没有想过你在互联网上的"身份证"是什么?更通俗地讲,在互联网中,什么能证明"你是你"? 当我们登录一个银行APP时,是不是只凭"用户名+口令&q ...

  4. 抛砖引玉,孢子,一种另类的WP7第三方应用数据交换方式

    孢子,一种另类的WP7第三方应用数据交换方式 <孢子>这个游戏玩过的人应该对里面的模型很有印象,尤其会对里面只靠一张PNG就能在游戏中还原成3D很感兴趣,今天要介绍的就是这种技术:在PNG ...

  5. 贝叶斯优化: 一种更好的超参数调优方式

    简介 本文受 浅析 Hinton 最近提出的 Capsule 计划 启发,希望以更通俗的方式推广机器学习算法,让有数学基础和编程能力的人能够乐享其中. 目前人工智能和深度学习越趋普及,大家可以使用开源 ...

  6. 哪种副业挣钱多?副业通过什么方式赚钱的呢?

    哪种副业挣钱多?副业通过什么方式赚钱的呢? 你是通过什么方式赚钱的呢? 在这里我们把它分为主业赚钱和副业赚钱,并且更多的是针对个人! 主业:大部分人的主业是通过工作打工带来的收入: 副业:业余时间兼职 ...

  7. java按空格分字符串,两种用空格分隔的java字符串的方式

    两种用空格分隔的java字符串的方式 两种方式: 1. String str = "123 456 789 111"; String [] strArray = str.split ...

  8. 在Windows, Mac, Linux三种系统中分别获取wifi密码的方式

    在Windows, Mac, Linux三种系统中分别获取wifi密码的方式 1. Windows netsh wlan show profile name=wifi名称 key=clear | fi ...

  9. 几种不需要戴眼镜的立体成像方式

    http://www.4dshijue.com/4dedu/2010/0605/126.html 3D技术的迅速发展,摘下眼镜看3D已经成了民心所向,也是3D技术发展的大势所趋,相信这一天很快就会到来 ...

最新文章

  1. 整图下沉,MindSpore图引擎详解
  2. 0元力压0.1元,中国电信中标连云港政务云项目
  3. ubuntu-18.04 root登录图形界面失败问题解决方案
  4. error LNK1104: 无法打开文件“ComService.lib”
  5. 使用Python增加csdn的访问量
  6. 你以为ACI=SDN?大错特错!
  7. 字节数组转换为图片_每日一课 | Python 3 TypeError:无法将“字节”对象隐式转换为str...
  8. java bean对象属性复制,将一个对象的属性值赋值给另一个对象,对象之间的复制方法
  9. sap crm button_正值SAP中国成立25周年之际,江苏金来奇智能科技SAPB1项目正式启动...
  10. android xml黑体字_如何在 Android 上使用思源黑体作为系统字体?
  11. 王道计算机考研课件,王道考研计算机组成原理课件ppt
  12. php中访问控制_PHP之Trait详解
  13. 用装饰器来进行登录验证
  14. RS纠删码性能分析实战
  15. 我要偷偷的学Python,然后惊呆所有人(第三天)
  16. 夏商周秦西东汉 三国两晋南北朝 隋唐五代和十国 辽宋夏金元明清
  17. 随机生成小球(HTML5)
  18. 快速批量导出excel超链接
  19. 台式计算机默认关机变注销,Win7电脑点关机变成注销怎么办?
  20. 笔记本gtx1650最好用驱动_Intel EVO平台认证有啥用?只看真实性能 闭着眼买笔记本都不会错-Intel,EVO,笔记本,认证 ——快科技(驱动之家旗下媒体)-...

热门文章

  1. Vant 日历组件改造,增加农历,左右点击按钮上一个月,下一个月
  2. html表格和列表标签
  3. 安卓木马 Marcher 窃取数十款银行 APP 账户凭证,杀毒软件无法卸载
  4. 【slingshot and tradeSeq】differential analysis between different lineages
  5. 用cuda改写NLM算法,并列出代码
  6. NTL密码算法开源库——大整数上多项式(ZZX,GF2X)
  7. 小学信息技术 计算机的灵魂 软件 教案,小学信息与信息技术教案
  8. MATLAB——零极点形式传递函数的建立及传函的部分分式展开
  9. PMP证书的有效期有多久呢?
  10. js中将中国标准时间格式、CST日期转换为yyyy-MM-dd HH:mm:ss格式