java实现抢红包传入指定的数字和概率,红包出现的尾数和指定的数字相同
时间: 2024-03-08 08:49:02 浏览: 59
好的,针对你的问题,以下是一个简单的 Java 代码实现,可以用于抢红包:
```java
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RedPacket {
private static final BigDecimal MIN_AMOUNT = new BigDecimal("0.01"); // 最小红包金额
private static final Random random = new Random(); // 随机数生成器
/**
* 抢红包方法
* @param totalAmount 红包总金额
* @param totalCount 红包个数
* @param specifiedNumber 指定的数字
* @param probability 指定数字出现的概率
* @return 返回抢到红包的金额
*/
public static BigDecimal grabRedPacket(BigDecimal totalAmount, int totalCount, int specifiedNumber, double probability) {
if (totalAmount.compareTo(BigDecimal.ZERO) <= 0 || totalCount <= 0) {
return BigDecimal.ZERO;
}
List<BigDecimal> redPacketList = new ArrayList<>(totalCount);
BigDecimal leftAmount = totalAmount;
int leftCount = totalCount;
BigDecimal maxAmount = leftAmount.divide(new BigDecimal(leftCount), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(2));
for (int i = 0; i < leftCount - 1; i++) {
BigDecimal amount = new BigDecimal(random.nextDouble()).multiply(maxAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
if (amount.compareTo(MIN_AMOUNT) < 0) {
amount = MIN_AMOUNT;
}
redPacketList.add(amount);
leftAmount = leftAmount.subtract(amount);
leftCount--;
maxAmount = leftAmount.divide(new BigDecimal(leftCount), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(2));
}
redPacketList.add(leftAmount);
BigDecimal grabbedAmount = BigDecimal.ZERO;
for (int i = 0; i < redPacketList.size(); i++) {
BigDecimal amount = redPacketList.get(i);
if (i == redPacketList.size() - 1 || random.nextDouble() < probability) {
if (amount.setScale(0, BigDecimal.ROUND_DOWN).intValue() % 10 == specifiedNumber) {
grabbedAmount = grabbedAmount.add(amount);
redPacketList.remove(i);
break;
}
}
}
if (grabbedAmount.compareTo(BigDecimal.ZERO) == 0) {
grabbedAmount = redPacketList.get(random.nextInt(redPacketList.size()));
}
return grabbedAmount;
}
}
```
这个代码中,我们首先定义了一个最小红包金额 MIN_AMOUNT 和一个随机数生成器 random。然后,我们编写了一个 grabRedPacket 方法,该方法接受一个总金额、红包个数、指定数字和概率,返回抢到的红包金额。
方法内部首先判断了总金额和红包个数是否为正数,如果不是,则直接返回 0。然后,我们定义了一个 redPacketList 列表来存储生成的红包金额。接着,我们计算了每个红包的最大金额,然后循环生成红包并添加到 redPacketList 中,直到剩下最后一个红包。我们把最后一个红包作为剩余的金额,添加到 redPacketList 中。
最后,我们循环遍历 redPacketList,判断每个红包是否被抢到。如果没有被抢到,则随机返回一个红包金额。如果被抢到,我们判断该红包金额的尾数是否和指定数字相同,如果是,则返回该红包金额,否则继续循环。
这是一个简单的 Java 代码实现,你可以根据自己的需求进行修改和优化。
阅读全文