java 抽奖功能收集

一、根据概率进行抽奖

参考:
java 抽奖概率逻辑实现(超简单,hutool很准)
java抽奖概率抽奖
java实现根据概率中奖率怎么算

1.概率实现抽奖原理

定义一个奖品池 如下:

Map<String, Integer> probabilityMap = new HashMap<>();
probabilityMap.put("一等奖", 10); // 10%的概率
probabilityMap.put("二等奖", 20); // 20%的概率
probabilityMap.put("三等奖", 30); // 30%的概率
probabilityMap.put("四等奖", 40); // 40%的概率

把奖品池中的概率相加(注意:总的概率之和不能大于100),然后使用java.util.Random的nextInt(int bound)获取一个随机数:

Random random = new Random();
int intRandom=random.nextInt(100);//100表示概率之后

或cn.hutool.core.util.RandomUtil中的randomInt(final int limitExclude)获取一个随机数:

int randomNum = RandomUtil.randomInt(100);//100表示概率之后

得到随机数之后循环奖品池,循环到第一个满足条件(随机数<=奖品池的概率/累加概率值)的奖品返回,在循环之前设置一个概率之和参数,初始值为0,在循环中累加概率值。

2.代码实现

import cn.hutool.core.util.RandomUtil;
 
import java.util.HashMap;
import java.util.Map;
 
public class ProbabilityLottery {
 
    public static <T> T lotteryByProbability(Map<T, Integer> probabilityMap) {
        int sum = probabilityMap.values().stream().mapToInt(Integer::intValue).sum();//获取概率之和
        int randomNum = RandomUtil.randomInt(sum);//获取随机数
        
        int currentSum = 0;//累加概率值
        for (Map.Entry<T, Integer> entry : probabilityMap.entrySet()) {
            currentSum += entry.getValue();
            if (randomNum <= currentSum) {
                return entry.getKey();
            }
        }
        // 应该不会执行到这里,除非传入的概率总和不是100%
        return null;
    }
 
    public static void main(String[] args) {
        Map<String, Integer> probabilityMap = new HashMap<>();
        probabilityMap.put("一等奖", 10); // 10%的概率
        probabilityMap.put("二等奖", 20); // 20%的概率
        probabilityMap.put("三等奖", 30); // 30%的概率
        probabilityMap.put("四等奖", 40); // 40%的概率
 
        String result = lotteryByProbability(probabilityMap);
        System.out.println("抽奖结果:" + result);
    }
}

二、随机抽奖

package com.dcqq.wechat;
import cn.hutool.core.util.RandomUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ProbabilityLottery {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("一等奖");
        list.add("二等奖");
        list.add("三等奖");
        list.add("四等奖");

        int randomNum = RandomUtil.randomInt(list.size()-1);//获取随机数
        System.out.println(list.get(randomNum));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值