用java实现模拟微信红包算法

文章目录

  • 实现过程
    • 1.
    • 2.

实现过程

1.

代码如下(示例):

import java.math.BigDecimal;
import java.util.ArrayList;

public class GenRedPacket {
	static ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();;

	public static BigDecimal bianLiJia(ArrayList<BigDecimal> list) {
		BigDecimal b = new BigDecimal("0");
		for (int i = 0; i < list.size(); i++) {
			b = b.add(list.get(i));
		}
		return b;
	}

	public static void bianLiJian(BigDecimal b1, BigDecimal b2) {
		if (bianLiJia(list).doubleValue() < b1.doubleValue()) {
			BigDecimal b3 = bianLiJia(list);
			BigDecimal b4 = b1.subtract(b3);
			int i = 0;
			list.set(i = (int) (Math.random() * (b2.intValue())), list.get(i).add(b4));
		} else if (bianLiJia(list).doubleValue() > b1.doubleValue()) {
			BigDecimal b3 = bianLiJia(list);
			BigDecimal b4 = b3.subtract(b1).divide(b2, 2, BigDecimal.ROUND_FLOOR);
			for (int i = 0; i < list.size(); i++) {
				if (list.get(i).doubleValue() > b4.doubleValue()) {
					list.set(i, list.get(i).subtract(b4));
				}
			}
		}
		if (bianLiJia(list).doubleValue() > b1.doubleValue()) {
			BigDecimal b3 = bianLiJia(list);
			BigDecimal b4 = b3.subtract(b1);
			for (int i = 0; i < list.size(); i++) {
				if (list.get(i).doubleValue() > b4.doubleValue()) {
					list.set(i, list.get(i).subtract(b4));
				}
			}
			bianLiJian(b1, b2);
		}
	}

	public static ArrayList<BigDecimal> genRedPacket(String total, int count) {

		BigDecimal b1 = new BigDecimal(total);
		BigDecimal b2 = new BigDecimal(count);
		for (int i = 0; i < count; i++) {
			String s = String.valueOf(((int) (Math.random() * (Integer.parseInt(total) + 1)))
					+ ((int) (Math.random() * 100) + 1) / 100.0);
			BigDecimal b3 = new BigDecimal(s);
			list.add(b3);
		}
		bianLiJian(b1, b2);
		return list;
	}
	
	public void fhb(String total, int count) {
		genRedPacket(total,count);
		int i = 1;
		for(BigDecimal b:list) {
			System.out.println("第"+i+"个红包:"+b+"元");
			i++;
		}
	}
}

2.

代码如下(示例):

import java.text.ParseException;
import java.util.Scanner;

public class Test {

	public static void main(String[] args) throws ParseException {
		Scanner scanner = new Scanner(System.in);
		GenRedPacket dp = new GenRedPacket();
		System.out.print("请输入要发红包金额与个数:");
		String s1 = scanner.next();
		int a1 = scanner.nextInt();
		dp.fhb(s1, a1);
	}
}


本文地址:https://blog.csdn.net/skaihzx/article/details/109957605

相关推荐:

如何在Python中通过计算欧氏距离实现基础的最近邻分类算法?

欧氏距离计算函数怎么写才不出错? 直接用math.sqrt和sum手动算平方和开方最稳妥,避免依赖未安装的库。常见错误是传入维度不一致的向量,比如训练样本是4维,测试样本只给了3个值——运行时会报IndexError或得到错误结果。 实操建议: 在计算前用len(vec1)==len(vec2)做校...

如何使用Python中的Isolation Forest算法实现生产环境的异常检测?

IsolationForest在生产环境不适合直接用于高吞吐、低延迟的实时流式场景,因其为无监督批处理算法,需完整训练集且无法在线更新模型,实际应采用周期性离线打分或结合轻量代理模型实现近实时响应。 IsolationForest在生产环境是否适合实时异常检测? 不适合直接用于高吞吐、低延迟的实时流...

LightGBM在Python下为什么比XGBoost快_基于直方图算法与单边梯度采样

LightGBM比XGBoost快的核心原因是直方图特征离散化和GOSS采样:前者将连续特征映射为整数桶,降低排序与增益计算复杂度;后者保留高梯度样本并加权采样低梯度样本,减少数据遍历量。 LightGBM在Python下比XGBoost快,核心原因不是“代码写得更精简”,而是算法层面的两个关键设计...

高效实现滚动窗口最小二乘贝塔系数的在线更新算法

本文介绍如何通过数学推导与增量计算,将滚动窗口ols贝塔系数的实时更新从o(n)矩阵运算优化至o(1)时间复杂度,显著提升金融时序信号生成性能。 本文介绍如何通过数学推导与增量计算,将滚动窗口ols贝塔系数的实时更新从o(n)矩阵运算优化至o(1)时间复杂度,显著提升金融时序信号生成性能。 在量化投...