日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java红包记录_微信红包算法(java)

發布時間:2024/10/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java红包记录_微信红包算法(java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

package com.example.ant.common.tools;

import java.util.LinkedList;

import java.util.List;

/**

* 描述:紅包算法

* User: 曾遠征

* Date: 2018-09-17

* Time: 14:09

*/

public class RedPacketTools {

/**

* 生成紅包最小值 1分

*/

private static final int MIN_MONEY = 1;

/**

* 生成紅包最大值 200人民幣

*/

private static final int MAX_MONEY = 200 * 100;

/**

* 小于最小值

*/

private static final int LESS = -1;

/**

* 大于最大值

*/

private static final int MORE = -2;

/**

* 正常值

*/

private static final int OK = 1;

/**

* 最大的紅包是平均值的 TIMES 倍,防止某一次分配紅包較大

*/

private static final double TIMES = 2.1F;

private int recursiveCount = 0;

private List splitRedPacket(int money, int count) {

List moneys = new LinkedList<>();

//計算出最大紅包

int max = (int) ((money / count) * TIMES);

max = max > MAX_MONEY ? MAX_MONEY : max;

for (int i = 0; i < count; i++) {

//隨機獲取紅包

int redPacket = randomRedPacket(money, MIN_MONEY, max, count - i);

moneys.add(redPacket);

//總金額每次減少

money -= redPacket;

}

return moneys;

}

private int randomRedPacket(int totalMoney, int minMoney, int maxMoney, int count) {

//只有一個紅包直接返回

if (count == 1) {

return totalMoney;

}

if (minMoney == maxMoney) {

return minMoney;

}

//如果最大金額大于了剩余金額 則用剩余金額 因為這個 money 每分配一次都會減小

maxMoney = maxMoney > totalMoney ? totalMoney : maxMoney;

//在 minMoney到maxMoney 生成一個隨機紅包

int redPacket = (int) (Math.random() * (maxMoney - minMoney) + minMoney);

int lastMoney = totalMoney - redPacket;

int status = checkMoney(lastMoney, count - 1);

//正常金額

if (OK == status) {

return redPacket;

}

//如果生成的金額不合法 則遞歸重新生成

if (LESS == status) {

recursiveCount++;

System.out.println("recursiveCount==" + recursiveCount);

return randomRedPacket(totalMoney, minMoney, redPacket, count);

}

if (MORE == status) {

recursiveCount++;

System.out.println("recursiveCount===" + recursiveCount);

return randomRedPacket(totalMoney, redPacket, maxMoney, count);

}

return redPacket;

}

/**

* 校驗剩余的金額的平均值是否在 最小值和最大值這個范圍內

*

* @param lastMoney

* @param count

* @return

*/

private int checkMoney(int lastMoney, int count) {

double avg = lastMoney / count;

if (avg < MIN_MONEY) {

return LESS;

}

if (avg > MAX_MONEY) {

return MORE;

}

return OK;

}

public static void main(String[] args) {

RedPacketTools redPacket = new RedPacketTools();

List redPackets = redPacket.splitRedPacket(20000, 100);

System.out.println(redPackets);

int sum = 0;

for (Integer red : redPackets) {

sum += red;

}

System.out.println(sum);

}

}

總結

以上是生活随笔為你收集整理的java红包记录_微信红包算法(java)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。