积分夺宝算法

参考文章

关于权重的随机抽取算法,抽一个次或抽多次的实现

/**
     * 积分夺宝开奖算法
     * @param userDrawList 夺宝用户list
     * @param targetPersonTimes 总中奖人次
     * @param drawInfo 抽奖信息记录(记录抽奖详情)
     */
    private List<UserDrawDTO> drawPrize(List<UserDrawDTO> userDrawList, Integer targetPersonTimes, Map<String,Object> drawInfo){
        //中奖人list
        List<UserDrawDTO> winnerList = Collections.EMPTY_LIST;
        Random random = new Random();

        //总抽奖次数
        Integer totalTimes = 0;

        //从大到小排序
        userDrawList = userDrawList.stream().sorted(((o1, o2) -> {
            if (o1.getTimes() > o2.getTimes()) {
                return -1;
            }
            if (o1.getTimes() < o2.getTimes()) {
                return 1;
            }
            return 0;
        })).collect(Collectors.toList());

        for (int i = 0; i < targetPersonTimes; i++) {
            //中奖号码
            int drawNum = random.nextInt(totalTimes) + 1;
            for (int j = 0; j < userDrawList.size(); j++) {
                Integer currentTimes = userDrawList.get(j).getTimes();
                if (currentTimes >= drawNum) {
                    //中奖人
                    winnerList.add(userDrawList.get(j));
//                    System.out.println("获奖人:" + userDrawList.get(j) + ", drawNum: " + drawNum);
                    //总抽奖次数减去此次中奖人的参加次数
                    totalTimes -= currentTimes;
                    userDrawList.remove(j);
                    break;
                }
                //如果当前用户未中奖,减去当前用户的参与次数,与下一位进行对比,一直减小到 >=下一位的参与次数
                drawNum -= currentTimes;
            }
        }
        drawInfo.put("totalTimes", totalTimes);

        return winnerList;
    }

@AllArgsConstructor
@Data
public class UserDraw {
    static int count = 0;
    //用户id
    int userId;
    //抽奖次数
    int times;

    public static void main(String[] args) {
//        for (int j = 0; j < 10; j++){
//            Random random = new Random();
//            System.out.println(random.nextInt(10) + 1);
//        }
//        System.out.println(count/10);
        choujiang();

    }

    public static void choujiang(){
        Random random = new Random();
        //总抽奖人次
        Integer totalTimes = 0;

        //模拟数据
        List<UserDraw> userDrawList = new ArrayList<>();
        for (int i = 1; i < 10; i++) {
            int times = random.nextInt(1000) + 1;
            UserDraw userDraw = new UserDraw(i, times);
            totalTimes += times;
            userDrawList.add(userDraw);
        }

        //排序
        userDrawList = userDrawList.stream().sorted(((o1, o2) -> {
            if (o1.getTimes() > o2.getTimes()) {
                return -1;
            }
            if (o1.getTimes() < o2.getTimes()) {
                return 1;
            }
            return 0;
        })).collect(Collectors.toList());
        System.out.println("算法前积分总和:" + totalTimes);
        userDrawList.stream().forEach(e -> {
//            System.out.println(e.toString());
        });
        //中奖人数
        int drawTotal = 10;
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < drawTotal; i++) {
            int index = 0;
            //中奖号码
            int drawNum = random.nextInt(totalTimes) + 1;
            list.add(drawNum);
            for (int j = index; j < userDrawList.size(); j++) {
//                System.out.println("对比的数据:" + userDrawList.get(j).getTimes() + ">= " + drawNum);
                if (userDrawList.get(j).getTimes() >= drawNum) {
                    if (userDrawList.get(j).getUserId() == 2){
                        count ++;
                    }
                    //中奖人
                    System.out.println("获奖人:" + userDrawList.get(j) + ", drawNum: " + drawNum);
                    totalTimes -= userDrawList.get(j).getTimes();
                    userDrawList.remove(j);
                    break;
                }
                drawNum -= userDrawList.get(j).getTimes();
            }
        }

    }
}

云购夺宝系统源码 源码描述: 一、源码特点 1、韬龙网络是国内第一家的提供云购夺宝源码系统的技术服务提供商。旗下的云购系统是国内领先的PHP云购夺宝源码,从2011年公司成立开始,程序历经200多次更新迭代! 2、云购夺宝系统是一套创新的PHP开源云购源码,精仿1元云购、1元夺宝、云购全球前台模板,同时还兼顾了各大浏览器的兼容性,拥有70多项首创功能,是目前国内被竞争对手模仿最多的云购系统提供商; 3、云购系统(YunGouCMS)内置支付宝、财付通、微信支付、百度钱包、京东钱包、网银在线、易宝支付及手机支付等20多种支付接口,所有网银用户均可无障碍支付。 二、菜单功能 1、保留云购夺宝系统版权前提下,允许学习交流、本地测试用,若用于商用请购买官方正版授权! 2、最新版YunGouCMS V5.2,程序一旦得到官方授权还可隐藏版权,还可免费享有更多增值服务,如Wap版、微信版、桌面版和APP程序(Android APP +IOS APP)服务。 -------------------------------------------------------------------- YouGouCMS V5.2 更新日志: 1、修复:分销、支付宝充值不到账等BUG; 2、修复:邀请好友、云购基金、微信,聚宝云支付、积分商城、账务明细、分页BUG 3、新增:网页版和手机版的三级分销功能(微信版单独优化邀请好友页面); 4、新增:卡密功能,完善快捷登录、三级分销功能、手机云购; 5、新增:2款支付接口; 6、新增:云购全球WAP模板、云通付移动端、京东钱包PC及移动端 备注说明:购买官方正版授权后可定制功能; 三、注意事项 1、开发语言为PHP,数据库为MySql 2、演示地址:http://www.yungoucms.cn(帐号:demo@yungoucms.com,密码:111111) 后台地址:http://www.yungoucms.cn/?/admin/user/login(帐号:test,密码:testtest) 本地安装授权码:9337979898E299A139389E59440399414CF9BD5F691E019096E5069EB39D 本地安装教程(必看):http://gd.yungoucms.com/hc/kb/article/6545/
### 关于开发或寻找王者荣耀积分夺宝模拟器 要实现一个用于模拟《王者荣耀》积分夺宝的程序或工具,可以从以下几个方面入手: #### 1. **需求分析** 需求的核心在于模拟抽奖的概率分布机制以及用户体验界面。通常,《王者荣耀》中的积分夺宝会涉及概率权重分配、奖品池设定等功能[^1]。 #### 2. **技术选型** 可以基于Python或其他编程语言来构建该模拟器。如果需要图形化界面,则可以选择PyQt或Tkinter作为GUI框架;如果是Web应用,则可采用Flask/Django等框架配合前端技术(HTML/CSS/JavaScript)。对于随机数生成部分,可以利用`random.choices()`函数设置不同奖项对应的概率。 ```python import random def simulate_lottery(probabilities, prizes): """ Simulates a lottery based on given probabilities and prize list. Args: probabilities (list): List of probability weights corresponding to each prize. prizes (list): List of possible outcomes/prizes. Returns: str: The selected prize from the simulation. """ result = random.choices(prizes, weights=probabilities)[0] return result # Example usage with hypothetical data prize_pool = ["Grand Prize", "Medium Reward", "Small Gift"] chance_distribution = [0.05, 0.15, 0.8] winner = simulate_lottery(chance_distribution, prize_pool) print(f"The winner is {winner}!") ``` 上述代码片段展示了如何通过指定概率列表和奖励列表来进行一次简单的抽奖模拟。 #### 3. **功能模块设计** - **用户交互层**: 提供友好的输入方式让用户参与抽签活动。 - **核心逻辑层**: 实现加权随机算法决定最终获奖情况。 - **数据存储层**(可选): 如果希望保存历史记录或者统计分析结果,需考虑数据库集成方案如SQLite/MongoDB等。 #### 4. **性能测试建议** 鉴于可能存在的高并发场景,在完成初步版本之后应对系统进行全面的压力测试评估其稳定性与效率表现。这里提到过Locust就是一个不错的选择因为它支持大规模分布式负载生成并且易于配置调整参数满足特定业务需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值