😀前言
本片文章讲解了群发普通红包的算法
🏠个人主页:[尘觉主页](https://blog.csdn.net/apple_67445472?type=blog)
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
在csdn获奖荣誉: 🏆csdn城市之星2名
💓Java全栈群星计划top前5
🤗 端午大礼包获得者
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊
文章目录
群发普通红包
流程图
MainRedPacket类
Manager类
Member类
User类
😘群发普通红包
😉题目介绍
某软件有多名用户(User类),某群聊中有群主(Manager类)和多名普通成员(Member类),现群主大方给成员发红包。红包的规则:群主发一笔金额,从群主余额中扣除,红包分配方式有两种:1普通红包:平均分成n等份给成员。2随机红包:随机红包大小分配给成员。成员拿到红包后,保存到成员余额中,最后并显示每个人抢到了多少红包。
😝流程图
😝运行效果图
💖MainRedPacket类
这个类的作用有
第一创造对象 并确定人的名字然后初始的余额
第二输入选择发多少钱 注意不能大于余额
第三选择是平均还是随机发
然后调用函数来执行对应的方法
最后输出
package 练习.week9.T5;
import java.util.ArrayList;
import java.util.Scanner;
public class MainRedPacket {
public static void main(String[] args) {
int fenfa;
int cont;
Scanner scanner = new Scanner(System.in);
Manager manager = new Manager("群主",10000);
Member one = new Member("1",0);
Member two = new Member("2",0);
Member three = new Member("3",0);
Member four = new Member("4",0);
Member five = new Member("5",0);
System.out.println("======抢红包钱=======");
one.show();
two.show();
three.show();
four.show();
five.show();
//发多少钱
System.out.println("发多少钱");
fenfa=scanner.nextInt();
System.out.println("什么方式发");
cont=scanner.nextInt();
if(cont==1)
{
System.out.println("=============金主发了"+fenfa+"大红包拉================");
ArrayList<Double> redList = manager.sent(fenfa,5);
//成员收红包
one.receive(redList);
two.receive(redList);
three.receive(redList);
four.receive(redList);
five.receive(redList);
}else {
//调用方法
Manager manager1 = new Manager();
manager1.RedEnvelope(fenfa,5);
ArrayList<Double> redList = manager1.redList;
//成员收红包
one.receive(redList);
two.receive(redList);
three.receive(redList);
four.receive(redList);
five.receive(redList);
}
//输出
one.show();
two.show();
three.show();
four.show();
five.show();
}
}
💖Manager类
这个是一个关键类
其中第一个sent方法的作用为平均分发这是平均的算法然后放入集合方便下一步随机用户抢红包
但是这样最后一个人会抢的多因为如果除不尽的话会把剩下的放入最后
int avg = totalMoney / count;
int mod = totalMoney % count;
第二个RedEnvelope方法的作用是随机分发这是平均刷法 因为要保证每个人都要抢到钱所以要设置最小值为0.01 然后余额减去随机生成的数 然后最后剩下的给最后放入集合
String money = formatter.format(random.nextDouble() * (Max - Min) + Min);
//将String类转换为double类,修改Max的值
Max = Double.valueOf(formatter.format(Max - Double.valueOf(money)));
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Random;
//群主的类
public class Manager extends User {
public Manager(){
}
public Manager(String name, int money) {
super(name, money);
}
public ArrayList<Double> redList = new ArrayList<>();
public ArrayList<Double> sent(int totalMoney, int count){//平均分
//储若干个红包金额
//首先看一下自己有多少钱
double leftMoney = super.getMoney();
if (totalMoney > leftMoney) {
System.out.println("余额不足");
return redList; //返回空
}
//重新设置余额
super.setMoney(leftMoney - totalMoney);
//发红包需要平均拆分成为count份
int avg = totalMoney / count;
int mod = totalMoney % count; //除不尽的情况
//除不开的零头,包在最后一个红包当中
//下面把红包一个个放到集合当中
for (int i = 0; i < count - 1; i++) {
System.out.println("第"+i+"个红包"+avg);
redList.add((double)avg);
}
//最后一个红包
double last = avg + mod;
System.out.println("最后一个红包"+last);
redList.add(last);
return redList;
}
public void RedEnvelope(double moneySum,int redNum) {//随机分
double Min=0.01;//最小金额
double Max=moneySum;//记录余额
double zhuan;
Random random=new Random();
NumberFormat formatter = new DecimalFormat("#.##");//数字格式化成小数点后2位
for(int i=1;i<redNum;i++) {
//随机生成Min到Max的随机数并规范到2位小数,是String类
String money = formatter.format(random.nextDouble() * (Max - Min) + Min);
//将String类转换为double类,修改Max的值
Max = Double.valueOf(formatter.format(Max - Double.valueOf(money)));
System.out.println("第"+i+"个红包:"+money+"元");
zhuan=Double.parseDouble(money);
redList.add(zhuan);
}
System.out.println("第"+redNum+"个红包:"+Max+"元");
redList.add(Max);
}
}
💖Member类
这个类的作用是receive方法读取前面的集合数据然后用户调用这个方法来随机获取集合里面的元素相当于抢红包
import java.util.ArrayList;
import java.util.Random;
//普通成员的类
public class Member extends User{
public Member() {
}
public Member(String name, int money) {
super(name, money);
}
public void receive(ArrayList<Double> list){
//随机获取一个集合当中的索引编号
int index = new Random().nextInt(list.size());
double dalta = list.remove(index);
//当前成员自己本来有多少钱
double money = super.getMoney();
//加法,并且从新设置回去
super.setMoney((money + dalta));
}
}
💖User类
这个类的作用是定义成员的名字和余额 然后等待前面的程序执行完成时候用户调用show方法来输出抢红包之后余额一共有多少钱
//用户类
public class User {
private String name;
private double money; //余额
public User() {
}
public User(String name, double money) {
this.name = name;
this.money = money;
}
//展现一下当前用户有多少钱
public void show(){
System.out.println("我叫:" + name + ",我有多少钱:" + money);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
😄总结
本章讲解了群发普通红包的算法
😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 [尘觉社区](https://bbs.csdn.net/forums/58c2ca9b8de344c69384b471dd4bd744)
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞文章来源:https://www.toymoban.com/news/detail-421518.html
文章来源地址https://www.toymoban.com/news/detail-421518.html
到了这里,关于红包算法关于---随机分发和平均分发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!