1、随机产生红包
任务:
(1)描述:编写一个将红包金额按一定数量随机分配的小程序。红包金额最大不能超过 200 元,每个人分到的红包最小不能少于 1 分钱,红包的最小单位是分;要避免前面分配的红包比重过大,导致后面的红包过小。
对于红包金额限制,可以定义两个常量表示最大额度与最小额度;在红包分配之前判断红包总金额以及每个人领到的红包金额是否合法;在分配红包之后判断剩下的人领到的红包金额是否合法。为了避免红包分配过大,可设置每个红包最大值为剩余红包平均数(剩余红包金额 / 剩余红包数量)的 2 倍,红包最小值依然为 0.1 分;
开始分配红包时,如果剩余红包数量为 1,则直接返回剩余红包总金额;如果红包数量不为 1,在每个红包的最大值与最小值之间随机产生一个整数,产生随机数的算法公式为:((int)Math.rint(Math.random() * (每个红包的最大值 - 每个红包的最小值) + 每个包的最小值)) % 每个红包的最大值 + 1(单位都是分);
在分配红包之后判断剩下的人领到的红包金额是否合法,如果不合法,需要重新产生分配方案,在重新产生分配方案的时候,需要确定产生的红包过大还是过小,如果红包过大,下次就随机一个最小值到本次红包金额之间的一个红包,如果红包金额过小,就产生一个此次红包金额到最大值之间的一个红包;依次执行,最后将分配到的红包金额放入一个 List 集合中。
(2)定义工具类RedPacketUtil,类中定义类属性:最小红包额度,最大红包额度,每个红包最大金额是平均值的倍数等;
定义isRight()函数检查红包金额的合法性,如平均值小于最小金额,总金额大于红包金额的最大值等都判断为不合法。
定义List splitRedPackets(int money, int count) 方法:参数分别为红包总金额(单位:分)和红包数量,将分配好的红包放入 List 集合。首先调用检查函数,如果金额不合法,抛出:“红包金额不合法”的自定义异常;根据红包数,红包总金额,红包最大金额和最小金额,循环调用随机产生每个红包值的函数randomVal(),返回值存入list集合。
定义随机产生单个红包值函数randomVal():首先进行判断,如果红包数量为1,直接返回金额;最大金额和最小金额相等,直接返回金额。随机产生一个红包值,(int)Math.rint(Math.random() * (每个红包的最大值 - 每个红包的最小值) + 每个红包的最小值)) % 每个红包的最大值 + 1(单位都是分)。判断是否合法isRight(剩余金额,剩余红包数),合法就返回。否则,如果下一轮红包平均值比最小值小,将此轮产生的红包值作为最大值,递归调用随机生成函数;如果下一轮红包平均值比最大值大,将此轮产生的红包值作为最小值,递归调用随机生成函数。
(3)自定义异常类,继承Exception,简单抛出提示信息即可。
2、抢红包程序
任务:模拟人员抢红包,并展示红包领取详情。
(1)定义RedEnvelope 类,可能用到的属性: 红包金额(分),红包数目 ,发送日期,第一个人抢红包的开始时间,红包抢完后的结束时间,List<Integer> bag; // 分配到的红包列表(分),Map<String,Double> info; // 红包领取信息
定义一个 open 的方法,该方法携带一个参数 name,表明是这个人打开了红包,在该方法中实现以下功能:如果超过 5 秒没人领取,红包过期,当再打开红包时,输出:“红包已经过期”;如果未过期,且第一个人打开红包时,将 start 设为当前时间,记录下红包开始领取的时间,将红包列表的最后一个值给该人,第二个人打开时就将红包列表的倒数第二位的值给他,输出:“恭喜xx,领取到了xx元”,并将姓名作为 key,红包金额作为 value 存到集合HashMap中(注意:输出和存储是需要将分转换为元,除以 100.0),将红包数量减去一,并判断红包数量是否为零,如果为零则获取当前时间为红包领取完的时间,计算红包几秒领取完毕,输出:“红包被抢完,一共用了xx秒”,后面的人领取红包时依次类推;如果红包领完后,且红包未过期,输出:“xx手速慢了,红包都没啦”;
(2)showInfo():该方法实现打印红包领取详情,输出格式为:“xx抢到了xx元”,当所有红包领取详情输出完毕后,最后输出谁是运气王,输出格式为:“其中,xx是运气王,抢到了xx元”。
参考代码:
3、抢红报测试程序
编写一个测试类,生成产生红包类对象,生成抢红包类对象,测试程序功能。
测试类就是含有main方法的类,在main方法里面调用上面定义好的类,执行检测结果是否正确。
public class Test{
public static void main(String [] args){
}
}
你这个题因该是有红包类对象和抢红包类对象得把
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632