Java编程随机发红包,红包随机算法Java实现

需求:红包总金额随机后每份金额:最大值200, 最小值0.01;最大份数100;

工具:idea

参考:微信红包算法以及带上下限的红包算法

基于微信红包算法以及带上下限的红包算法优化,修改了部分极值时,报错的问题,例如0.03元的红包分为2份。

import com.alibaba.fastjson.JSON;

import org.junit.Assert;

import org.junit.Test;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Random;

/**

* 参考:https://blog.csdn.net/paincupid/article/details/82054647

* @author crossoverJie

* Date: 03/01/2018 16:52

* @since JDK 1.8

*/

public class RedPacketTools {

public static BigDecimal MONEY_1_100 = new BigDecimal("0.01");

public static final BigDecimal TIMES_100 = new BigDecimal(100);

public static BigDecimal MONEY_200 = new BigDecimal(200);

private static final Random random = new Random();

/**

* 红包随机算法(分和元转换)

* @param money 红包总金额,单位为元

* @param count 红包份数

* @return 返回值的金额单位为元

*/

public static List createBonusList(BigDecimal money, int count) {

List moneys = new ArrayList<>(count);

int _money = money.multiply(TIMES_100).intValue();

int rdMin = MONEY_1_100.multiply(TIMES_100).intValue();

int rdMax = MONEY_200.multiply(TIMES_100).intValue();

int[] _moneys = createBonusList(_money, count, rdMin, rdMax, 0.8);

for (int m: _moneys) {

moneys.add(new BigDecimal(m).divide(TIMES_100));

}

return moneys;

}

/**

* 返回一次抽奖在指定中奖概率下是否中奖

* @param rate 中奖概率

* @return xxx

*/

private static boolean canReward(double rate) {

return Math.random() <= rate;

}

/**

* 返回min~max区间内随机数,含min和max

* @param min xxx

* @param max xxx

* @return xxx

*/

private static int getRandomVal(int min, int max)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值