Commit 95b863fa by lvyp

红包雨-红包发放

1 parent 6b005320
package com.polysoft.activity.constant;
import java.util.ArrayList;
import java.util.List;
/**
* @author lvyp
* @date 2021/1/29
* 红包算法分析
* 1.设置金额的上下限 2.判断金额是否合法 3.随机产生红包
*/
public class RedPacketUtil {
//1.设置金额的上下限 最少0.01,最多200
private double MINMONEY ;
private double MAXMONEY ;
private double TIMES ;
/**
* 4.实现红包分配,为了避免一个红包占用大量的金额,设定非最后一个红包的 最大金额,可以设置平均值的N陪,
*
* */
public List<Double> splitRedPackets(double money, int count) {
if (!isRight(money, count)) {
return null;
}
List<Double> list = new ArrayList<Double>();
double max = (double) (money * TIMES / count);
max = max > MAXMONEY ? MAXMONEY : max;
for (int i = 0; i < count; i++) {
double one = randomRedPacket(money, MINMONEY, max, count - i);
list.add(one);
money -= one;
}
return list;
}
/**
* 3.随机产生红包
*
* */
private double randomRedPacket(double money, double mins, double maxs, int count) {
if (count == 1) {
return (double) (Math.round(money * 100)) / 100;
}
if (mins == maxs) {
return mins;
}
double max = maxs > money ? money : maxs;
double one = ((double) Math.random() * (max - mins) + mins);
one = (double) (Math.round(one * 100)) / 100;
double moneyOther = money - one;
if (isRight(moneyOther, count - 1)) {
return one;
} else {
double avg = moneyOther / (count - 1);
if (avg < MINMONEY) {
return randomRedPacket(money, mins, one, count);
} else if (avg > MAXMONEY) {
return randomRedPacket(money, one, maxs, count);
}
}
return one;
}
public RedPacketUtil(double MINMONEY, double MAXMONEY, double TIMES) {
this.MINMONEY = MINMONEY;
this.MAXMONEY = MAXMONEY;
this.TIMES = TIMES;
}
//2.判断金额是否合法 如果超过了最大值与最小值,错误
private boolean isRight(double money, int count) {
double avg = money / count;
if (avg < MINMONEY) {
return false;
} else if (avg > MAXMONEY) {
return false;
}
return true;
}
public static void main(String[] args) {
RedPacketUtil util = new RedPacketUtil(5,100,2);
List<Double> doubles = util.splitRedPackets(1250, 100);
doubles.forEach(item -> System.out.println(item));
}
}
package com.polysoft.activity.constant;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
/**
* @author lvyp
* @date 2021/1/29
*/
public class Test {
public static void main(String[] args) {
//红包数
int number = 10;
//红包总额
float total = 100;
float money;
//最小红包
double min = 1;
double max;
int i = 1;
List math = new ArrayList();
DecimalFormat df = new DecimalFormat("###.##");
while (i < number) {
//保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值
max = total - min * (number - i);
int k = (int)(number - i) / 2;
//保证最后两个人拿的红包不超出剩余红包
if (number - i <= 2) {
k = number - i;
}
//最大的红包限定的平均线上下
max = max / k;
//保证每个红包大于最小值,又不会大于最大值
money = (int) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));
money = (float)money / 100;
//保留两位小数
money = Float.parseFloat(df.format(money));
total=(int)(total*100 - money*100);
total = total/100;
math.add(money);
System.out.println("第" + i + "个人拿到" + money + "剩下" + total);
i++;
//最后一个人拿走剩下的红包
if (i == number) {
math.add(total);
System.out.println("第" + i + "个人拿到" + total + "剩下0");
}
}
//取数组中最大的一个值的索引
System.out.println("本轮发红包中第" + (math.indexOf(Collections.max(math)) + 1) + "个人手气最佳");
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!