分享一个用Java写的红包抽奖方法

这是一个Java实现的抽奖程序,使用了 TreeMap 和 HashMap 数据结构来存储奖品权重和红包金额范围。程序首先根据权重配置生成一个平滑的概率分布,然后进行随机数抽取以确定获奖者。接着,根据获奖的红包范围生成随机金额。在main方法中,进行了多次抽奖演示并打印了每次的红包金额。这个程序可以用于模拟具有不同概率的抽奖活动或者红包发放场景。
摘要由CSDN通过智能技术生成

希望有人喜欢,哈哈

import java.math.BigDecimal;
import java.util.*;

/**
 * 抽奖
 *
 * @author Administrator
 */
public class Lottery {

    private static String lottery(Map<String, Double> map) {
        TreeMap<Double, String> weightMap = new TreeMap<Double, String>();
        map.forEach((k, v) -> {
            //配置奖品对应中间率
            double lastWeight = weightMap.size() == 0 ? 0 : weightMap.lastKey().doubleValue();
            weightMap.put(v + lastWeight, k);
        });
        //抽奖
        double randomWeight = Math.random() * weightMap.lastKey();
        NavigableMap<Double, String> tailMap = weightMap.tailMap(randomWeight, false);
        return weightMap.get(tailMap.firstKey());
    }
    //抽奖具体红包金额
    private static double lotteryAward(String value){
        String[] range = value.split("-");
        double length = Double.parseDouble(range[1])-Double.parseDouble(range[0]);
        double money = 0;
        if (range.length>1){
            money =Math.random()*length+Double.parseDouble(range[0]);
        }else {
            money =Math.random()*Double.parseDouble(range[1]);
        }
        BigDecimal b = new BigDecimal(money);
        return b.setScale(
                2,   BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static void main(String[] args) {
        Map map = new HashMap<>();
        //红包范围和对应权重,概率等于权重除以总权重
        map.put("0.1-0.3",90.0);
        map.put("1.1-1.5",9.0);
        map.put("90-100",1.0);
        //抽奖次数
        int lotteryNum = 10;
        for (int i = 0; i < lotteryNum; i++) {
            String key = lottery(map);
            System.out.println(lotteryAward(key));
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值