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));
    }
}
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的抽奖功能Java代码示例: ```java import java.util.ArrayList; import java.util.List; import java.util.Random; public class Lottery { // 奖品种类 private static final String[] PRIZES = {"一等奖", "二等奖", "三等奖", "参与奖"}; // 每种奖品的数量 private static final int[] PRIZE_COUNTS = {1, 2, 5, 100}; // 每种奖品的中奖概率 private static final double[] PRIZE_PROBABILITIES = {0.01, 0.03, 0.1, 0.5}; // 每个用户每天最多抽奖次数 private static final int MAX_LOTTERY_TIMES_PER_DAY = 3; // 抽奖记录 private List<String> lotteryRecord = new ArrayList<>(); // 获取随机数生成器 private Random random = new Random(); // 判断用户今天是否还可以继续抽奖 public boolean canLotteryToday(String userId) { int lotteryCountToday = 0; for (String record : lotteryRecord) { String[] fields = record.split(","); if (fields[0].equals(userId)) { lotteryCountToday++; } } return lotteryCountToday < MAX_LOTTERY_TIMES_PER_DAY; } // 抽奖 public String lottery(String userId) { if (!canLotteryToday(userId)) { return "今天您已经抽过奖了,请明天再来!"; } int prizeIndex = -1; double randomValue = random.nextDouble(); double sum = 0.0; for (int i = 0; i < PRIZE_PROBABILITIES.length; i++) { sum += PRIZE_PROBABILITIES[i]; if (randomValue < sum) { prizeIndex = i; break; } } String prize = PRIZES[prizeIndex]; PRIZE_COUNTS[prizeIndex]--; lotteryRecord.add(userId + "," + prize); return "恭喜您获得了:" + prize; } } ``` 以上代码中,抽奖功能的实现主要分为两个部分: 1. 判断用户今天是否还可以继续抽奖的逻辑,通过遍历抽奖记录来判断当天用户已经抽奖的次数是否达到上限; 2. 抽奖的逻辑,根据每个奖品的中奖概率来计算中奖结果,同时需要更新奖品数量和抽奖记录。 在实际应用中,可能需要加入更多的逻辑判断和安全措施,例如防止恶意用户抽奖等,但以上代码可以作为一个简单的抽奖功能的参考实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值