一种第N个红包最大实现的方式
一 序
需求背景:常叫外面的同学对于美团或者饿了么的那种在微信群里分享的,第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个红包最大实现的方式相关推荐
- 【解决方案】谈公众号红包的正确打开方式--传奇创世
红包,红包.每次群发红包为什么只能是200?原来这是腾讯做出的一个举措.群发有红包?那如果想要微信公众号的红包怎么办? 其实,也是可以实现的.接下来的解决方案就是针对公众号红包做出的,让我们一起来看它 ...
- 99种用Racket说I love you的方式
99种用Racket说I love you的方式 来源 https://www.tuicool.com/articles/qiyeAz 原文 http://www.soimort.org/posts ...
- 芯盾时代:一种会思考的新一代安全身份认证方式
喂,有没有想过你在互联网上的"身份证"是什么?更通俗地讲,在互联网中,什么能证明"你是你"? 当我们登录一个银行APP时,是不是只凭"用户名+口令&q ...
- 抛砖引玉,孢子,一种另类的WP7第三方应用数据交换方式
孢子,一种另类的WP7第三方应用数据交换方式 <孢子>这个游戏玩过的人应该对里面的模型很有印象,尤其会对里面只靠一张PNG就能在游戏中还原成3D很感兴趣,今天要介绍的就是这种技术:在PNG ...
- 贝叶斯优化: 一种更好的超参数调优方式
简介 本文受 浅析 Hinton 最近提出的 Capsule 计划 启发,希望以更通俗的方式推广机器学习算法,让有数学基础和编程能力的人能够乐享其中. 目前人工智能和深度学习越趋普及,大家可以使用开源 ...
- 哪种副业挣钱多?副业通过什么方式赚钱的呢?
哪种副业挣钱多?副业通过什么方式赚钱的呢? 你是通过什么方式赚钱的呢? 在这里我们把它分为主业赚钱和副业赚钱,并且更多的是针对个人! 主业:大部分人的主业是通过工作打工带来的收入: 副业:业余时间兼职 ...
- java按空格分字符串,两种用空格分隔的java字符串的方式
两种用空格分隔的java字符串的方式 两种方式: 1. String str = "123 456 789 111"; String [] strArray = str.split ...
- 在Windows, Mac, Linux三种系统中分别获取wifi密码的方式
在Windows, Mac, Linux三种系统中分别获取wifi密码的方式 1. Windows netsh wlan show profile name=wifi名称 key=clear | fi ...
- 几种不需要戴眼镜的立体成像方式
http://www.4dshijue.com/4dedu/2010/0605/126.html 3D技术的迅速发展,摘下眼镜看3D已经成了民心所向,也是3D技术发展的大势所趋,相信这一天很快就会到来 ...
最新文章
- 整图下沉,MindSpore图引擎详解
- 0元力压0.1元,中国电信中标连云港政务云项目
- ubuntu-18.04 root登录图形界面失败问题解决方案
- error LNK1104: 无法打开文件“ComService.lib”
- 使用Python增加csdn的访问量
- 你以为ACI=SDN?大错特错!
- 字节数组转换为图片_每日一课 | Python 3 TypeError:无法将“字节”对象隐式转换为str...
- java bean对象属性复制,将一个对象的属性值赋值给另一个对象,对象之间的复制方法
- sap crm button_正值SAP中国成立25周年之际,江苏金来奇智能科技SAPB1项目正式启动...
- android xml黑体字_如何在 Android 上使用思源黑体作为系统字体?
- 王道计算机考研课件,王道考研计算机组成原理课件ppt
- php中访问控制_PHP之Trait详解
- 用装饰器来进行登录验证
- RS纠删码性能分析实战
- 我要偷偷的学Python,然后惊呆所有人(第三天)
- 夏商周秦西东汉 三国两晋南北朝 隋唐五代和十国 辽宋夏金元明清
- 随机生成小球(HTML5)
- 快速批量导出excel超链接
- 台式计算机默认关机变注销,Win7电脑点关机变成注销怎么办?
- 笔记本gtx1650最好用驱动_Intel EVO平台认证有啥用?只看真实性能 闭着眼买笔记本都不会错-Intel,EVO,笔记本,认证 ——快科技(驱动之家旗下媒体)-...
热门文章
- Vant 日历组件改造,增加农历,左右点击按钮上一个月,下一个月
- html表格和列表标签
- 安卓木马 Marcher 窃取数十款银行 APP 账户凭证,杀毒软件无法卸载
- 【slingshot and tradeSeq】differential analysis between different lineages
- 用cuda改写NLM算法,并列出代码
- NTL密码算法开源库——大整数上多项式(ZZX,GF2X)
- 小学信息技术 计算机的灵魂 软件 教案,小学信息与信息技术教案
- MATLAB——零极点形式传递函数的建立及传函的部分分式展开
- PMP证书的有效期有多久呢?
- js中将中国标准时间格式、CST日期转换为yyyy-MM-dd HH:mm:ss格式