程序中经常遇到随机送红包之类的情景,这个随机还得指定概率,比如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实现概率计算(数字不同范围按照不同几率产生随机数)相关推荐

  1. java 百分比概率计算,JAVA实现概率计算(数字不同范围按照不同几率产生随机数)...

    程序中经常遇到随机送红包之类的情景,这个随机还得指定概率,比如10%的机率可以得到红包.那么java怎么实现一个简单的概率计算了,见如下例子: int randomInt = RandomUtils. ...

  2. Java黑皮书课后题第7章:*7.11(统计:计算标准差)编程练习题5.45计算数字的标准差。本题…计算标准差,使用一个数组存储x的每个数。编写测试程序,提示用户输入10个数字,显示平均值和标准差

    7.11(统计:计算标准差)编程练习题5.45计算数字的标准差.本题-计算标准差,使用一个数组存储x的每个数.编写测试程序,提示用户输入10个数字,显示平均值和标准差 题目 题目描述与运行示例 破题 ...

  3. Java黑皮书课后题第7章:**7.3(计算数字的出现次数)编写程序,读取1到100之间的整数,然后计算每个数出现的次数。假定输入0表示结束

    7.3(计算数字的出现次数)编写程序,读取1到100之间的整数,然后计算每个数出现的次数 题目 题目描述+运行示例 破题 法一 法二 代码 法一:硬生生解出来 法二完整代码 题目 题目描述+运行示例 ...

  4. 工期概率计算_如何从文本和数字单元格值计算工期

    工期概率计算 I was attending to one of MS-Excel question here on EE and found this question very interesti ...

  5. Java实现 蓝桥杯 算法提高 概率计算

    算法提高 概率计算 时间限制:1.0s 内存限制:256.0MB 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率. 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔. 输出 ...

  6. oracle 偶数与奇数,在PL / SQL中计算数字中的奇数和偶数

    我们给定一个正整数数字,任务是使用PL / SQL计算数字中奇数和偶数的计数. PL / SQL是SQL与编程语言的过程功能的组合.它是由Oracle Corporation在90年代初开发的,目的是 ...

  7. Java实现标题相似度计算,文本内容相似度匹配,Java通过SimHash计算标题文本内容相似度

     目录 一.前言 二.关于SimHash 补充知识 一).什么是海明距离 二).海明距离的应用 三).什么是编辑距离 三.SimHash算法的几何意义和原理 一).SimHash算法的几何意义 二). ...

  8. 崩坏3卡池模拟器及毕业期望概率计算(含保底)

    目录 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 程序演示 得出的一些有趣结果 readme code 崩坏3卡池模拟器及毕业期望概率计算(含保底) 简介 最近学概率论要求写论文,没什么好写的 ...

  9. html输入日期算出星座,java输入日期计算星座

    java输入日期计算星座 [2021-01-31 12:59:06]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...

最新文章

  1. 沙市一中2021年高考成绩查询,2021年荆州高考状元名单公布,荆州文理科状元是谁多少分...
  2. 【Netty】Netty线程模型和EventLoop
  3. 加强原始创新和基础研究的前提:三项破解之策
  4. Elasticsearch java客户端调用cat服务
  5. Chrome API操作串口
  6. jax-rs jax-ws_极端懒惰:使用Spring Boot开发JAX-RS服务
  7. 请问WCF 跟 WebService之间异同
  8. WeChatTweak-微信小助手安装教程
  9. python-字母与ascii码的转换-利用数字转字母-利用字母转数字
  10. PM经验谈 项目管理工具必备的5个功能
  11. tomcat编码配置gbk_tomcat的编码设置 tomcat中文问题的解决
  12. 蜂窝网络版苹果iPad mini 6不支持毫米波5G
  13. isc dhcp 服务器性能,DHCP 服务器搭建问题
  14. redmibook螃蟹网卡信号差问题
  15. Arcgis for JS实现台风运动路径与影像范围的显示
  16. c++跟踪调试怎么用 dev_DEVC++调试方法
  17. STM32G474的启动模式NRST引脚特性
  18. android glide缺少方法,android - 无法膨胀且找不到类android支持设计的行为BottomSheetBehavior - 堆栈内存溢出...
  19. python kfold交叉验证_KFold交叉验证
  20. 计算机思维游戏,思维数字 电脑版

热门文章

  1. 01背包 模板1 2 总结
  2. 多个页面同时跳转到一个页面,然后返回到上级页面
  3. 在VS2010开发的MVC3 应用程序中设定默认的浏览器
  4. jsonArray与 jsonObject区别与js取值
  5. LoadRunner远程监测Centos服务性能配置过程
  6. 使用zerorpc踩的第一个坑:
  7. Linux统计文件行数、字数、字节数
  8. 枚举enum、NS_ENUM 、NS_OPTIONS
  9. 查看及修改MYSQL最大连接数
  10. String.getBytes(Unicode)的疑问 以及 SHIFT-JIS编码范围