JAVA实现概率计算(数字不同范围按照不同几率产生随机数)
程序中经常遇到随机送红包之类的情景,这个随机还得指定概率,比如10%的机率可以得到红包。那么java怎么实现一个简单的概率计算了,见如下例子:
int randomInt = RandomUtils.nextInt(1,101); if(randomInt <= 10){ //100里面1个数,小于等于10的概率就是10%//do something }
RandomUtils工具类是commons-lang3包里面的
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version> </dependency>
如果要在某个数字区间产生一个随机数,区间内部在不同的片段几率不同如何实现呢?经常有这样的场景,比如,随机赠送红包,范围0.1元-100元,0.1-1元的概率是90%,1元-10元的概率是9%,10元-100元的概率是1%,也就是说数额越大得到的几率越小!实现的原理如下图:
原理就是,将范围分割成一个个子范围(片段),具体采用哪个范围,再用机率判断。片段机率可以依次排好序,映射成[1,100]之间的数字。然后随机一个[1,100]之间的数,该数落在哪个区间,就采用哪个片段产生随机数。具体源代码如下:
package com.hdwang;import org.apache.commons.lang3.RandomUtils;import java.util.ArrayList; import java.util.List;/*** 按几率产生随机数* 例如,产生0.1-100的随机数,0.1-1的几率是90%,1-10的几率是9%,10-100的几率是1%*/ public class RateRandomNumber {/*** 产生随机数* @param min 最小值* @param max 最大值* @return 随机结果*/public static double produceRandomNumber(double min,double max){return RandomUtils.nextDouble(min,max); //[min,max] }/*** 按比率产生随机数* @param min 最小值* @param max 最大值* @param separates 分割值(中间插入数)* @param percents 每段数值的占比(几率)* @return 按比率随机结果*/public static double produceRateRandomNumber(double min,double max,List<Double> separates,List<Integer> percents){if(min > max){throw new IllegalArgumentException("min值必须小于max值");}if(separates == null || percents==null || separates.size()==0){return produceRandomNumber(min,max);}if(separates.size() +1 != percents.size()){throw new IllegalArgumentException("分割数字的个数加1必须等于百分比个数");}int totalPercent = 0;for(Integer p:percents){if(p<0 || p>100){throw new IllegalArgumentException("百分比必须在[0,100]之间");}totalPercent += p;}if(totalPercent != 100){throw new IllegalArgumentException("百分比之和必须为100");}for(double s:separates){if(s <= min || s >= max){throw new IllegalArgumentException("分割数值必须在(min,max)之间");}}int rangeCount = separates.size()+1; //例如:3个插值,可以将一个数值范围分割成4段//构造分割的n段范围List<Range> ranges = new ArrayList<Range>();int scopeMax = 0;for(int i=0;i<rangeCount;i++){Range range = new Range();range.min = (i==0 ? min:separates.get(i-1));range.max = (i== rangeCount-1 ?max:separates.get(i));range.percent = percents.get(i);//片段占比,转换为[1,100]区间的数字range.percentScopeMin = scopeMax +1;range.percentScopeMax = range.percentScopeMin + (range.percent-1);scopeMax = range.percentScopeMax;ranges.add(range);}//结果赋初值double r = min;int randomInt = RandomUtils.nextInt(1,101); //[1,100]for(int i=0;i<ranges.size();i++){Range range = ranges.get(i);//判断使用哪个range产生最终的随机数if(range.percentScopeMin <= randomInt && randomInt <= range.percentScopeMax){r = produceRandomNumber(range.min,range.max);break;}}return r;}public static class Range{public double min;public double max;public int percent; //百分比public int percentScopeMin; //百分比转换为[1,100]的数字的最小值public int percentScopeMax; //百分比转换为[1,100]的数字的最大值 }public static void main(String[] args) {List<Double> separates = new ArrayList<Double>();separates.add(1.0);separates.add(10.0);List<Integer> percents = new ArrayList<Integer>();percents.add(90);percents.add(9);percents.add(1);for(int i=0;i<100;i++) {double number = produceRateRandomNumber(0.1, 100, separates, percents);System.out.println(String.format("%.2f",number));}} }
转载于:https://www.cnblogs.com/hdwang/p/9172172.html
JAVA实现概率计算(数字不同范围按照不同几率产生随机数)相关推荐
- java 百分比概率计算,JAVA实现概率计算(数字不同范围按照不同几率产生随机数)...
程序中经常遇到随机送红包之类的情景,这个随机还得指定概率,比如10%的机率可以得到红包.那么java怎么实现一个简单的概率计算了,见如下例子: int randomInt = RandomUtils. ...
- Java黑皮书课后题第7章:*7.11(统计:计算标准差)编程练习题5.45计算数字的标准差。本题…计算标准差,使用一个数组存储x的每个数。编写测试程序,提示用户输入10个数字,显示平均值和标准差
7.11(统计:计算标准差)编程练习题5.45计算数字的标准差.本题-计算标准差,使用一个数组存储x的每个数.编写测试程序,提示用户输入10个数字,显示平均值和标准差 题目 题目描述与运行示例 破题 ...
- Java黑皮书课后题第7章:**7.3(计算数字的出现次数)编写程序,读取1到100之间的整数,然后计算每个数出现的次数。假定输入0表示结束
7.3(计算数字的出现次数)编写程序,读取1到100之间的整数,然后计算每个数出现的次数 题目 题目描述+运行示例 破题 法一 法二 代码 法一:硬生生解出来 法二完整代码 题目 题目描述+运行示例 ...
- 工期概率计算_如何从文本和数字单元格值计算工期
工期概率计算 I was attending to one of MS-Excel question here on EE and found this question very interesti ...
- Java实现 蓝桥杯 算法提高 概率计算
算法提高 概率计算 时间限制:1.0s 内存限制:256.0MB 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率. 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔. 输出 ...
- oracle 偶数与奇数,在PL / SQL中计算数字中的奇数和偶数
我们给定一个正整数数字,任务是使用PL / SQL计算数字中奇数和偶数的计数. PL / SQL是SQL与编程语言的过程功能的组合.它是由Oracle Corporation在90年代初开发的,目的是 ...
- Java实现标题相似度计算,文本内容相似度匹配,Java通过SimHash计算标题文本内容相似度
目录 一.前言 二.关于SimHash 补充知识 一).什么是海明距离 二).海明距离的应用 三).什么是编辑距离 三.SimHash算法的几何意义和原理 一).SimHash算法的几何意义 二). ...
- 崩坏3卡池模拟器及毕业期望概率计算(含保底)
目录 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 程序演示 得出的一些有趣结果 readme code 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 最近学概率论要求写论文,没什么好写的 ...
- html输入日期算出星座,java输入日期计算星座
java输入日期计算星座 [2021-01-31 12:59:06] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...
最新文章
- 沙市一中2021年高考成绩查询,2021年荆州高考状元名单公布,荆州文理科状元是谁多少分...
- 【Netty】Netty线程模型和EventLoop
- 加强原始创新和基础研究的前提:三项破解之策
- Elasticsearch java客户端调用cat服务
- Chrome API操作串口
- jax-rs jax-ws_极端懒惰:使用Spring Boot开发JAX-RS服务
- 请问WCF 跟 WebService之间异同
- WeChatTweak-微信小助手安装教程
- python-字母与ascii码的转换-利用数字转字母-利用字母转数字
- PM经验谈 项目管理工具必备的5个功能
- tomcat编码配置gbk_tomcat的编码设置 tomcat中文问题的解决
- 蜂窝网络版苹果iPad mini 6不支持毫米波5G
- isc dhcp 服务器性能,DHCP 服务器搭建问题
- redmibook螃蟹网卡信号差问题
- Arcgis for JS实现台风运动路径与影像范围的显示
- c++跟踪调试怎么用 dev_DEVC++调试方法
- STM32G474的启动模式NRST引脚特性
- android glide缺少方法,android - 无法膨胀且找不到类android支持设计的行为BottomSheetBehavior - 堆栈内存溢出...
- python kfold交叉验证_KFold交叉验证
- 计算机思维游戏,思维数字 电脑版