中奖代码实现

这篇具有很好参考价值的文章主要介绍了中奖代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中奖代码实现
奖品类

public class Gift {
    //奖品位置
    private int index;
    //奖品ID
    private String gitfId;
    //奖品名称
    private String giftName;
    //奖品中奖几率
    private double probability;
}

不同概率抽奖工具包

public class LotteryUtil {
    /**
     * 抽奖
     *
     * @param orignalRates 原始的概率列表,保证顺序和实际物品对应
     * @return 物品的索引
     */
    public static int lottery(List<Double> orignalRates) {
        if (orignalRates == null || orignalRates.isEmpty()) {
            return -1;
        }

        int size = orignalRates.size();

        // 计算总概率,这样可以保证不一定总概率是1  demo中的值是1.108
        double sumRate = 0d;
        for (double rate : orignalRates) {
            sumRate += rate;
        }

        // 计算每个物品在总概率的基础下的概率情况
        //0.18050541516245486,0.3610108303249097,0.7220216606498194,0.9927797833935018,0.9927797833935018,0.9927797833935018,1.0
        List<Double> sortOrignalRates = new ArrayList<Double>(size);
        Double tempSumRate = 0d;
        for (double rate : orignalRates) {
            tempSumRate += rate;
            sortOrignalRates.add(tempSumRate / sumRate);
        }


        // 根据区块值来获取抽取到的物品索引
        // 生成随机值
        double nextDouble = Math.random();
        // 将随机值插入数组
        sortOrignalRates.add(nextDouble);
        // 排序
        Collections.sort(sortOrignalRates);

        //随机值所在的位置就是当前中奖奖品
        return sortOrignalRates.indexOf(nextDouble);
    }

    public static int getJD(List<Double> orignalRates) {
        if (orignalRates == null || orignalRates.isEmpty()) {
            return -1;
        }

        int size = orignalRates.size();

        // 计算总概率,这样可以保证不一定总概率是1
        double sumRate = 0d;
        for (double rate : orignalRates) {
            sumRate += rate;
        }

        // 计算每个物品在总概率的基础下的概率情况
        List<Double> sortOrignalRates = new ArrayList<Double>(size);
        Double tempSumRate = 0d;
        for (double rate : orignalRates) {
            tempSumRate += rate;
            sortOrignalRates.add(tempSumRate / sumRate);
        }

        // 根据区块值来获取抽取到的物品索引
        double nextDouble = Math.random();
        sortOrignalRates.add(nextDouble);
        Collections.sort(sortOrignalRates);

        return sortOrignalRates.indexOf(nextDouble);
    }
}

测试类

   public static void main(String[] args) {

        List<Gift> gifts = new ArrayList<Gift>();
        // 序号==物品Id==物品名称==概率
        gifts.add(new Gift(1, "P1", "物品1", 0.2d));
        gifts.add(new Gift(2, "P2", "物品2", 0.2d));
        gifts.add(new Gift(3, "P3", "物品3", 0.4d));
        gifts.add(new Gift(4, "P4", "物品4", 0.3d));
        gifts.add(new Gift(5, "P5", "物品5", 0d));
        gifts.add(new Gift(6, "P6", "物品6", -0.1d));
        gifts.add(new Gift(7, "P7", "物品7", 0.008d));

        List<Double> orignalRates = new ArrayList<Double>(gifts.size());
        for (Gift gift : gifts) {
            double probability = gift.getProbability();
            if (probability < 0) {
                probability = 0;
            }
            orignalRates.add(probability);
        }

        // statistics
        Map<Integer, Integer> count = new HashMap<Integer, Integer>();
        double num = 10000;
        for (int i = 0; i < num; i++) {
            int orignalIndex = LotteryUtil.lottery(orignalRates);

            Integer value = count.get(orignalIndex);
            count.put(orignalIndex, value == null ? 1 : value + 1);
        }

        for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
            System.out.println(gifts.get(entry.getKey()) + ", count=" + entry.getValue() + ", probability="
                    + entry.getValue() / num);
        }
    }

执行结果

Gift [index=1, gitfId=P1, giftName=物品1, probability=0.2], count=1754, probability=0.1754
Gift [index=2, gitfId=P2, giftName=物品2, probability=0.2], count=1823, probability=0.1823
Gift [index=3, gitfId=P3, giftName=物品3, probability=0.4], count=3613, probability=0.3613
Gift [index=4, gitfId=P4, giftName=物品4, probability=0.3], count=2732, probability=0.2732
Gift [index=7, gitfId=P7, giftName=物品7, probability=0.008], count=78, probability=0.0078

不同概率的抽奖原理很简单
就是把0到1的区间分块,而分块的依据就是物品占整个的比重,再根据随机数种子来产生0-1中间的某个数,来判断这个数是落在哪个区间上,而对应的就是抽到了那个物品。随机数理论上是概率均等的,产生的每个数理论上也应该概率均等,那么相应的区间所含数的多少就体现了抽奖物品概率的不同。(p.s. 当然数目是数不清楚的,具体抽象话了点)

这个实例的数据可以说明

  1. 概率可以是负数和0,当然实际上中应该不会(p.s. 正常情况下可能真的有0,比如抽个iphone5,当然是抽不到的了,这个时候,构建礼物(List gifts)的时候最好就不要加这个进去),还有可以把负数的处理放到抽奖工具类(LotteryUtil)中;
  2. 所有礼物加起来的概率可以不是1,可以认为这里的概率是一个权重。

来源:https://developer.aliyun.com/article/44578#comment文章来源地址https://www.toymoban.com/news/detail-406273.html

到了这里,关于中奖代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • @全体开发者们,ChunJun 有奖征文,精美奖品,快来参加!

    2022年4月,在 FlinkX 进行初版开源的整整四年后,技术团队决定对FlinkX进行整体升级,并更名为 ChunJun。到目前为止,ChunJun 正式更名上线已经过了一年多了。作为一款稳定、易⽤、⾼效、批流⼀体的数据集成框架,相信各位关注着、喜爱着、使用着 ChunJun 的开发者们在过去的

    2024年02月09日
    浏览(39)
  • 七星彩中奖号码模拟

    七星彩号码抽取规则。 前区:抽取前区6个号码,每个号码是0~9之间选1个。 后区:抽取后区1个号码,每个号码是0~14之间选1个。   运行结果:  

    2024年01月23日
    浏览(42)
  • uniapp 中奖信息横向循环滚动

    2024年01月25日
    浏览(49)
  • 服务机器人有哪些品类

    服务机器人是指具备自主运动、感知环境、实现人机交互等能力的机器人,它可以被应用于不同的场景,如餐饮、医疗、物流等行业。根据其功能和应用场景的不同,服务机器人可以分为以下几类: 1. 餐饮服务机器人      随着社会发展和人们需求的不断变化,餐饮服务机

    2024年02月14日
    浏览(38)
  • Linux Xshell配置public key实现免密登录linux服务器

    linux服务器安装成功后,登录linux服务器的工具有很多中,例如:Xshell、SecureCRT等等。而我所服务的用户使用xshell工具来对linux服务器进行运维。 当使用xshell登录linux服务器时,xshell提供了三种身份验证方式: 1.Password(P)密码(W) 2.Public Key(U)用户密钥(K)[密码(H)] 3.Keyboard Interactiv

    2024年02月11日
    浏览(64)
  • 品类超全的免费 API 大全整理

    AI 绘画:通过AI 生成图片,包括图生文、文生图等。 人脸检测:快速检测图片中的人脸并返回人脸位置,输出人脸关键点坐标,支持识别多张人脸。 静态活体检测:静态活体检测主要用于针对用户上传图像,返回该图像中的人脸是否为真人;基于图片中人像的破绽(摩尔纹

    2024年02月03日
    浏览(45)
  • 【python-致用】为嫖掘金月更奖品,我用刚学的python做了个批量文件内容替换

    前几天学习了python的文件读取操作,可以用来干点什么呢?嘿,正好很多平台都推出了博客月更活动,但由于不同的平台环境(如markdown语法差别、活动要求),每搬运一篇博客都要幸苦地进行一些 重复性的 手动修改,实在是麻烦。 人生苦短 ,我决定试试 python 能不能帮我

    2024年02月12日
    浏览(44)
  • 【大数据学习篇8】 热门品类Top10分析

    掌握热门品类Top10分析实现思路 掌握如何创建Spark连接并读取数据集 掌握利用Spark获取业务数据 掌握利用Spark统计品类的行为类型 掌握利用Spark过滤品类的行为类型 掌握利用Spark合并相同品类的行为类型 掌握利用Spark根据品类的行为类型进行排序 掌握将数据持久化到HBase数据

    2024年02月06日
    浏览(44)
  • 实时采集福利彩票的中奖信息和最新开奖信息-JAVA

    用来采集福利彩票的中奖信息和最新开奖信息。 可以采集的彩票类型包括:1快乐8,2双色球,3福彩3D,4七乐彩,5大乐透,6排列3,7排列5,8七星彩 本项目介绍了如何使用代理IP和多线程采集公开彩票数据,项目尚不具备使用条件,仅供学习参考 项目需要用Maven引入,这里输

    2024年02月07日
    浏览(42)
  • 2023天猫运营数据分析:Q1防晒品类行业分析报告

    随着防晒观念的普及,日常防晒已逐步成为很多人的习惯。加之今年消费市场日渐复苏,消费者的“报复性出游”也加速了防晒市场的发展。 市场对防晒品类在2023年的表现抱有更高的期待,防晒品类有望成为整个化妆品消费领域复苏较好的赛道。 根据鲸参谋电商数据显示,

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包