java 简单实现转盘

写了个简单的示例,可以根据自身项目需求补充业务代码

数据库表结构

CREATE TABLE `turnplate_config` (
  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '转盘id',
  `reward_figure` decimal(55,2) DEFAULT NULL COMMENT '奖励数量',
  `percenti` decimal(11,2) DEFAULT NULL COMMENT '概率百分比',
  `sort` int DEFAULT NULL COMMENT '排序',
  `image_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '转盘图片',
  PRIMARY KEY (`config_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;

实体类

@Data
@ToString
public class TurnplateConfig {

    /**
     * 转盘id
     * default value: null
     */
    @TableId(type = IdType.AUTO)
    private Integer configId;

    /**
     * 数字
     * default value: null
     */
    @ApiModelProperty(value = "奖励")
    private BigDecimal rewardFigure;

    /**
     * 百分比
     * default value: null
     */
    @ApiModelProperty(value = "百分比")
    private BigDecimal percenti;

    /**
     * 排序
     * default value: null
     */
    @ApiModelProperty(value = "排序")
    private Integer sort;

    /**
     * 图片
     * default value: null
     */
    @ApiModelProperty(value = "图片")
    private String imageUrl;

}

此处还要创建

TurnplateConfigMapper,

TurnplateService,

TurnplateServiceImpl,

TurnplateController

我就省略了

实现代码

    @Override
    public Object openTheTurntable() {
        //根据自身产品补充逻辑
        //获取转盘结果
        TurnplateConfig turnplateConfig = getTurntableConfiguration();
        //返回转盘结果
        return turnplateConfig;
    }


    /**
     * 获取转盘结果
     *
     * @return
     */
    private TurnplateConfig getTurntableConfiguration() {
        //获取转盘配置
        List<TurnplateConfig> list = turnplateConfigMapper.selectList(new LambdaQueryWrapper<TurnplateConfig>());
        List<TurnplateConfig> turnplateConfigs = new ArrayList<>();
        //随机数
        BigDecimal prob = randomNumber();
        int index = 0;
        TurnplateConfig turnplateConfig = new TurnplateConfig();
        BigDecimal probability = BigDecimal.ZERO;
        for (TurnplateConfig config : list) {
            BigDecimal endProbability = probability.add(config.getPercenti());
            if (probability.compareTo(prob) < 1 && prob.compareTo(endProbability) < 1) {
                turnplateConfigs.add(config);
                //随机取出符合条件的配置
                index = new Random().nextInt(turnplateConfigs.size());
                turnplateConfig = turnplateConfigs.get(index);
                break;
            }
            //拿到概率相加
            probability = probability.add(config.getPercenti());
        }
        return turnplateConfig;
    }


    /**
     * 随机数获取
     */
    private BigDecimal randomNumber() {
        //随机数
        Double number = (Math.random() * 100) + 0.0001;
        DecimalFormat df = new DecimalFormat("0.0000");
        String str = df.format(number);
        BigDecimal prob = new BigDecimal(str);
        return prob;
    }

### Java实现转盘抽奖功能 Java可以用来实现转盘抽奖功能,其核心在于通过随机数生成器模拟用户的抽奖过程,并结合预设的概率分配机制来决定最终的中奖结果。以下是具体方法及其代码示例。 #### 1. 奖项与概率配置 在实现过程中,首先需要定义奖项列表以及对应的中奖概率。这些数据可以通过`List<Map<String, Object>>`结构存储,其中每个Map对象代表一个奖项的信息,包括名称、概率以及其他属性。 ```java // 定义奖项和对应概率 List<Map<String, Object>> prizes = new ArrayList<>(); prizes.add(Map.of("name", "一等奖", "probability", 0.05)); prizes.add(Map.of("name", "二等奖", "probability", 0.15)); prizes.add(Map.of("name", "三等奖", "probability", 0.30)); prizes.add(Map.of("name", "谢谢参与", "probability", 0.50)); // 占比最高 ``` 上述代码片段展示了如何初始化带有不同概率的奖项集合[^1]。 #### 2. 随机数生成 为了模拟用户点击按钮后的抽奖行为,程序会利用`Random`类生成一个介于0到总概率之间的随机浮点数值。此值用于后续匹配具体的奖项。 ```java double totalProbability = prizes.stream() .mapToDouble(item -> (double)item.get("probability")) .sum(); Random randomGenerator = new Random(); double randomNumber = randomGenerator.nextDouble() * totalProbability; ``` 这里计算了所有奖项加总的理论概率并据此生成了一个均匀分布的小数作为抽样依据[^2]。 #### 3. 判断中奖情况 接下来遍历奖项列表累积当前已处理过的累计概率范围直到找到第一个满足条件(即累加起来超过刚才产生的那个随机数)的那个项目为止: ```java double cumulativeProb = 0d; for (var prize : prizes){ double prob = (double)prize.get("probability"); if ((cumulativeProb += prob) >= randomNumber){ System.out.println("恭喜您获得了:" + prize.get("name")); break; } } ``` 当某个区间的上限超过了之前创建出来的伪随机变量时,则认为该区间内的事件发生——也就是相应的奖励被选中[^3]。 #### 4. 控制每日抽奖次数及成本等因素 如果还需要考虑诸如单日最多允许尝试几次或者每次消耗积分等问题的话,在实际应用当中应该加入额外字段记录相关信息并且做相应校验逻辑判断是否符合条件再继续执行以上流程[^4]。 ```java int maxAttemptsPerDay = 5; // 设置每天最大抽奖次数 boolean hasEnoughPoints = true; // 检查是否有足够的积分 if(attemptCountToday < maxAttemptsPerDay && hasEnoughPoints){ performDraw(); // 如果符合规定则调用上面提到的相关函数完成一次完整的抽奖动作 } else { System.err.println("今日剩余机会不足或积分不够!"); } ``` --- ### 总结 综上所述,基于Java的大转盘抽奖主要涉及以下几个方面的工作:一是合理规划各个等级礼品所占比例;二是借助计算机内部固有的不确定性原理选取特定的结果;三是综合考量外部约束比如时间窗口限制或是经济因素的影响从而构建更加贴近现实场景的应用模型^。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值