红包算法关于---随机分发和平均分发

简介: 红包算法关于---随机分发和平均分发

😀前言

本片文章讲解了群发普通红包的算法

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉


😘群发普通红包

😉题目介绍

某软件有多名用户(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;
    }
}

😄总结

本章讲解了群发普通红包的算法

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

 


目录
相关文章
|
1月前
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
80 0
|
8月前
|
算法 测试技术 C++
|
1月前
|
算法
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
57 0
|
1月前
|
算法
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
153 0
|
10月前
|
机器学习/深度学习 传感器 算法
【虚警检测】基于CA-CFAR(单元平均恒虚警)、GO-CFAR(最大选择恒虚警)、SO-CFAR(最小选择恒虚警)算法的恒虚警检测附Matlab代码
【虚警检测】基于CA-CFAR(单元平均恒虚警)、GO-CFAR(最大选择恒虚警)、SO-CFAR(最小选择恒虚警)算法的恒虚警检测附Matlab代码
|
15天前
|
存储 算法 数据可视化
如何使用多种算法解决LeetCode第135题——分发糖果问题
如何使用多种算法解决LeetCode第135题——分发糖果问题
|
11天前
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
|
1月前
|
算法 定位技术
六六力扣刷题贪心算法之分发饼干
六六力扣刷题贪心算法之分发饼干
36 0
|
1月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 135. 分发糖果 算法解析
☆打卡算法☆LeetCode 135. 分发糖果 算法解析
|
7月前
|
算法 网络架构
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
40 0

热门文章

最新文章