概率抽奖常用两种方式

java 概率抽奖简单实现,自定义概率、奖品数量控制概率 阅读详情

概率抽奖

方式一

之前看到的一个概率抽奖的方法,忘记出处了。整理到我的博客,方便自己查看

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class LotteryUtil {

    /**
     * 抽奖,获取中奖奖品
     * @param awardList 奖品及中奖概率列表
     * @return 中奖商品
     */
    public static Award lottery(List<Award> awardList) {
        if(awardList.isEmpty()){
            throw new RuntimeException();
        }
        //奖品总数
        int size = awardList.size();

        //计算总概率
        double sumProbability = 0d;
        for (Award award : awardList) {
            sumProbability += award.getProbability();
        }

        //计算每个奖品的概率区间
        //例如奖品A概率区间0-0.1  奖品B概率区间 0.1-0.5 奖品C概率区间0.5-1
        //每个奖品的中奖率越大,所占的概率区间就越大
        List<Double> sortAwardProbabilityList = new ArrayList<Double>(size);
        Double tempSumProbability = 0d;
        for (Award award : awardList) {
            tempSumProbability += award.getProbability();
            sortAwardProbabilityList.add(tempSumProbability / sumProbability);
        }

        //产生0-1之间的随机数
        //随机数在哪个概率区间内,则是哪个奖品
        double randomDouble = Math.random();
        //加入到概率区间中,排序后,返回的下标则是awardList中中奖的下标
        sortAwardProbabilityList.add(randomDouble);
        Collections.sort(sortAwardProbabilityList);
        int lotteryIndex = sortAwardProbabilityList.indexOf(randomDouble);
        return awardList.get(lotteryIndex);
    }

    public static void main(String[] args) {
        List<Award> awardList = new ArrayList<Award>();
        /*
         * 使用以下方法 或者将 内部类Award定义为静态的
        LotteryUtil lottery = new LotteryUtil();
        awardList.add(lottery.new Award("10个积分",0.35d));
        */
        awardList.add(new Award("10个积分",0.35d));
        awardList.add(new Award("33个积分",0.25d));
        awardList.add(new Award("5元红包",0.1d));
        awardList.add(new Award("20元话费",0.05d));
        awardList.add(new Award("京东100元购物卡",0.0005d));
        awardList.add(new Award("未中奖",0.2495d));
        System.out.println(0.35+0.25+0.1+0.05+0.0005+0.2495);
        Map<String,Integer> result = new HashMap<String,Integer>();
        for(int i=0;i<10000;i++){
            Award award = lottery(awardList);
            String title = award.getAwardTitle();
            Integer count = result.get(title);
            result.put(title, count == null ? 1 : count + 1);
        }

        for (Entry<String, Integer> entry : result.entrySet()) {
            System.out.println(entry.getKey() + ", count=" + entry.getValue() +", reate="+ entry.getValue()/10000d);
        }
    }
    
   static class Award{
        public Award(){}
        public Award(String awardTitle,double probability){
            this.awardTitle = awardTitle;
            this.probability = probability;
        }
        /**奖品ID**/
        private String awardId;
        /**奖品名**/
        private String awardTitle;
        /**中奖概率**/
        private double probability;
        public String getAwardId() {
            return awardId;
        }
        public void setAwardId(String awardId) {
            this.awardId = awardId;
        }
        public String getAwardTitle() {
            return awardTitle;
        }
        public void setAwardTitle(String awardTitle) {
            this.awardTitle = awardTitle;
        }
        public double getProbability() {
            return probability;
        }
        public void setProbability(double probability) {
            this.probability = probability;
        }
    }
}

方式二

思路若设置区间宽度是100000,需要配置人员根据概率给每个物品都配置一个对应的区间段,用于表示概率。这种方式代码量非常简单,也简单易懂

ruleDesc-是配置的json字符串
{
    "randomValue": 100000,
    "propsList": [
        {
            "giftCode": "goods_code_A",
            "giftName": "奖品A",
            "minNum": 0,
            "maxNum": 65000
        },
        {
            "giftCode": "goods_code_B",
            "giftName": "奖品B",
            "minNum": 65001,
            "maxNum": 90000
        },
        {
            "giftCode": "goods_code_C",
            "giftName": "奖品C",
            "minNum": 90001,
            "maxNum": 95000
        },
        {
            "giftCode": "goods_code_D",
            "giftName": "奖品D",
            "minNum": 95001,
            "maxNum": 97500
        },
        {
            "giftCode": "goods_code_E",
            "giftName": "奖品E",
            "minNum": 97501,
            "maxNum": 99980
        },
        {
            "giftCode": "goods_code_F",
            "giftName": "奖品F",
            "minNum": -1,
            "maxNum": -1
        },
        {
            "giftCode": "goods_code_G",
            "giftName": "奖品G",
            "minNum": 99981,
            "maxNum": 100000
        }
    ]
}
String ruleDesc = "奖品配置json字符串";
JSONObject configObj=JSONObject.fromObject(ruleDesc);
int randomValue = configObj.getInt("randomValue");
JSONArray configArray = configObj.getJSONArray("propsList");
int tmpValue= new Random().nextInt(randomValue);
for(int i=0;i<configArray.size();i++) {
	JSONObject jsonObj = configArray.getJSONObject(i);
	String giftCode = jsonObj.getString("giftCode");
	int minNum = jsonObj.getInt("minNum");
	int maxNum = jsonObj.getInt("maxNum");
	if(tmpValue >=minNum && tmpValue<=maxNum) {
		drawPrizeCode=giftCode;
		break;
	}
}
cocos2dx之抽奖界面与获奖概率的设计(二) 上一篇博客,我们讲解了抽奖界面的设计,其中着重讲解了下沿椭圆运动的动作类EllipseBy。本篇将讲解抽奖概率的设计。 转盘抽奖的方式有两种:第一种是先转转盘,转到谁就是谁。第二种是我先计算你抽中了什么奖品,然后再转到相应的奖品上(我擦,这不是暗箱操作吗!!)。 阅读详情

相关推荐

Java 实现抽奖的两种方式

Java实现抽奖的两种方式 方式一:随机数在哪个区间内返回区间下标 方式二:随机数加入区间点集合排序返回随机数下标

lcb9354的博客 2670

根据概率抽奖算法

1、奖项以及中奖概率设置 奖项数量如下(不同的奖项可以是相同的奖不影响结算的结果): 奖项一:100 奖项二:100 奖项三:100 奖项四:200 奖项五:500 设置总的中奖的概率为10%,不中奖的概率为90%, 抽奖的算法核心:现有一万个球,球的编号是1-10000,其中数字1-1000范围内的球代表的为中奖(1万乘以10%=1000 范围刚好是1-1000),1001-10000范围内的球不中奖(1万乘以90%=9000 范围刚好1001-10000),每次抽奖抽中的数字有两种可能:

qq_16553883的博客 1万+

【Java算法】Java抽奖算法,适用于各种抽奖

奖品类 /** * 奖品类 */ @Data @AllArgsConstructor @NoArgsConstructor public class Prize { /** * 奖品序号 */ private Integer prizeIndex; /** * 奖品id */ private Long prizeId; /** * 奖品名称 */ private String prizeName

谢哥哥的博客 8247

抽奖概率-三种算法

一、逢“几”中奖 逢“几”中奖,即通过预估抽奖人数和奖品数来判断,“几”=(抽奖人数/奖品数)*N。这是一种最简单抽奖算法,适合抽奖人数众多,而且互相无联系的情况。如今大为流行的微博转发得奖就常常使用这种算法,即根据转发次数来决定奖品归属,透明而且具有激励性。 当然这个“几”也不单只次数,还可能是时间,逢某个时间点就可以抽中,不过这种方案可能产生无人中奖和很多人中奖的情况,时间点的安排很关键!

Oversdownload的博客 1万+

概率抽奖算法实现:从刮刮卡到轮盘抽奖

本文还有配套的精品资源,点击获取 简介:本项目名为“概率抽奖算法Demo”,聚焦于为刮刮卡和轮盘类抽奖场景设计算法。该算法确保了公平性和随机性,通过精确的概率分配和随机数生成来决定中奖结果,同时优化算法效率,提高用户体验。开发者可根据源代码深入理解实现细节,并根据业务需求调整和扩展算法。 1. 概率抽奖算法原理与实践 在当今数字化时代,概率抽奖算法已成为众多...

weixin_32306683的博客 3152

简易概率抽奖系统设计与实现

本文还有配套的精品资源,点击获取 简介:抽奖系统在IT领域被广泛应用,尤其在游戏和营销活动中。本文探讨了如何设计一个遵循预设概率公平抽选的抽奖系统。我们将利用C#中的 System.Random 类来生成随机数,并基于指定概率实现奖项抽取。文章中提供了一个抽奖类的示例代码,它存储奖项概率并执行抽奖逻辑,确保了概率的准确性和程序的健壮性。 1. 抽奖系...

weixin_42576467的博客 2711

抽奖模块-概率抽奖

这里面的关键是在遍历奖品概率集合,对每个物品计算出在总概率的基础下的概率情况,然后进行区块概率累加的方式来获取奖品利率比,将利率比封装成一个集合,接着将随机种子丢到集合里,观察种子在集合中的下标对应到奖品列表的下标,获取奖品的概率索引并返回,最终得以实现概率抽奖。这里主要是对奖品集合进行解析,得出对应奖品的概率集合,供下面的概率抽奖来使用。

weixin_45207751的博客 253

使用springboot实现的抽奖完整源码

后台使用springboot来实现抽奖的算法逻辑完整版,可直接运行代码访问controller里的/award接口进行测试

游戏抽奖概率模型

本文主要想罗列出游戏中常见的一些抽奖概率模型,并对其做简要的分析和讨论。 游戏的设计经常会有一些含有随机性质的抽奖设计。比如说卡牌抽奖、购买随机物品等等。它们都可以分为下面这两大类: 1、纯随机概率计算: 纯随机是指:随机结果不受外界影响并且随机的值一直没有变化。比如说大多数购买随机物品的情况。随机物品商店里面获得各种商品的几率都是一样的,不会因为你多次购买不中哪一件商品就会将...

higher2016的博客 2万+

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1890

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

作为经典畅销书的升级版,本书在第1版的基础上新增了大量新知识(如闪存、UFS、测试、文件系统等),并改写或删减了许多过时或不适用的内容,总修改量超过60%。本书由SSD技术社区SSDFans的核心团队成员联合业界、高校SSD方面的专家共同完成,相对于第1版,内容更全面、更新,也更有深度。本书从产品、技术和应用3个维度展开,全面、详细讲解了SSD的发展历史、产品形态、工作原理、整体架构,以及各个功能模块的原理和使用,从SSD的前端接口协议到FTL算法,再到后端的闪存和纠错,以及测试,本书都有涉及。

阿玥的小博客 3122

抽奖代码及概率

```java package cn.tedu.cy; import java.util.Random; import java.util.Scanner; public class demo4 { public static void main(String[] args) { // TODO Auto-generated method stub //模拟游戏中奖 java.u...

qq_44789987的博客 1617

告别IMEI!手把手教你用UUID实现Android设备唯一标识(兼容Android 10-13)

本文详细探讨了在Android 10及以上版本中,如何构建合规且高可用的设备唯一标识方案以替代被限制访问的IMEI。文章深入分析了Android设备标识符的演变,并提供了基于UUID/GUID的完整实现策略,包括生成算法、多级持久化存储方案(如MediaStore)、权限处理以及版本兼容性实践,帮助开发者应对Android 10-13的隐私政策变化。

weixin_28339967的博客 574

Jmeter关于抽奖概率的测试方法

在对抽奖进行测试时,都会去对奖品的概率进行测试,确保概率的准确性。可以学习到flask的简单使用,jmeter的简单应用,概率的基本测试方式。我们调整线程达到1000个(相当于1000个人同时来抽奖,会造成并发,对电脑要求较高),或者调整循环次数(1个人去抽奖1000次),并启动。如图,我们需要填写服务器,然后路径,请求方式,和端口号。在运行结束之后,我们也得到了我们的结果数据与我们设计的数据进行比较。为了更加直观的进行概率的抽奖,我们直接写一个抽奖接口进行测试,方便大家参考。

大家一起学编程(python) 4445

AI 赋能测试全生命周期:多 Agent 协同的自动化提效方案

本文提出了一种基于Coze平台的多Agent协同测试解决方案,旨在解决软件测试中PRD解析不清晰、测试点覆盖不全、用例编写效率低、代码生成耗时等痛点。通过PRD优化、测试点生成、测试用例生成和单元测试框架生成四个Agent的协同工作,结合Cursor工具实现从需求到代码的全链路自动化。以电商平台登录模块为例,展示了从模糊PRD到标准化测试用例和可执行Java单元测试代码的完整转化流程。该方案通过AI赋能显著提升测试效率,减少人工干预,实现测试覆盖率≥95%,为快速迭代的软件研发提供了高效的测试自动化支持。

QINJIEEE的博客 1101

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

努力让自己发光,对的人才能迎着光而来 9万+

python转盘抽奖概率_转盘指定概率抽奖

前段时间项目中开了一个转盘抽奖的活动,转盘抽奖是一个比较简单的算法,下面介绍两种实现第一种实现import randomfrom typing import Listdef random_pick(item_list: List[str], probability_list: List[float]) -> str"""以设定的概率从列表里随机抽取一个值返回:param item_list:...

weixin_39588911的博客 767

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

Robot_PLC_HMI_Automation 8584

java中奖概率_java实现抽奖概率类

本文实例为大家分享了java实现抽奖概率类的具体代码,供大家参考,具体内容如下在一些项目需求中,可能会遇到抽奖问题,如提供一系列奖品及获奖概率,要求根据概率返回每次抽到的奖品。以下是本人在实际项目中写的一个抽奖工具类,与大家共同分享:import java.util.ArrayList;import java.util.List;import java.util.Random;/*** 抽奖工具类...

weixin_36269396的博客 3022

ZYNQ BRAM实现PS与PL数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过BRAM模块,也就是Block RAM实现此要求。本章通过Zynq的GP Master接口读写PL端的BRAM,实现与PL的交互。在本实验中加入了自定义的FPGA程序,并利用AXI4总线进行配置,通知其何时读写BRAM。以下为本实验原理图,CPU通过AXI BRAM Controller读取BRAM数据,CPU仅配置自定义的PL BRAM Controller 的寄存器,不通过它读写数据。

baidu_34971492的博客 2276

YOLO26-Quantized:面向国产AI芯片的全栈量化方案,适配昇腾310P与寒武纪MLU270

在算力国产化替代的行业趋势下,昇腾310P、寒武纪MLU270已成为工业边缘视觉、智能检测场景的主流国产AI芯片选型。针对原生YOLO26模型在国产芯片上推理效率低、算子兼容性差、量化精度塌陷三大核心痛点,本文提出YOLO26-Quantized全栈量化方案,覆盖训练感知量化(QAT)、离线静态量化(PTQ)、模型编译优化、芯片专属部署全流程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 762

微信小程序九宫格抽奖和转盘抽奖的实现

描述: 最近在工作中遇到了小程序抽奖的一些页面制作,以前制作网页抽奖的时候,在jQuery插件库谁便找一个Demo就可以满足我们的需求了,自己动手写的话不仅会拖慢项目进度,而且写出来的也未必有别人的那么流畅自然。而在小程序中我们就没有这么幸福了(ಥ﹏ಥ),并没有丰富的插件库供给我们使用,所以该写的还得自己动手写。好了,下面是常见的两种抽奖方式:九宫格和转盘,在实际项目中用的还不错,分享给大家。 一、九宫格抽奖: 效果: 思路:    首先是结构上,用弹性布局就可以了,每一个奖品的宽度设置成3分之1,超

weianl的博客 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用java代码实现简单的概率随机抽奖算法,看完相信你也会

工作需要,这两天写一个简单的java抽奖算法,因为逻辑简单不复杂,所以代码也很简洁,可以做到不同权重有不用的中奖概率(就类似于nginx集群一样,权重越大,概率越高),在这里将java概率随机抽奖代码抽离出来分享给大家。 具体需求: 给第三方推送数据,每个第三方根据预算会有不同的额度,考虑到服务器压力,所以采取了主动推送的方式,在每次推送的时候,需要根据第三方的配额计算出相应的概率,然后挑选一个第...

1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

php常用抽奖概率算法(抽奖,大转盘,广告首选)

算法一 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /** * 全概率计算 * * @param array $p array('a'=&gt...

辉少的博客 1318

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

django+redis实现可设置概率的大转盘抽奖

你好,大家好,我以及很久很久没有在优快云上写文章了,上一篇文章还是在2018年一月份写的,现在以及过去了大半年,我也从一个做PHP开发实习生变成了一个目前做的Python的开发的搬砖工,希望大佬们多多指正。 废话不多说,我们开始正文。 目前公司的项目是一个做游戏盒子的微信小程序,里面涉及到一个大转盘抽奖的系统,UI给的设计图如下: 要求是可以设置各个奖品,以及控制每个奖品获取的概率。 ...

wry_developer的博客 3281
上一篇: List集合自定义排序
下一篇: 如何在项目中使用Active MQ
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值