日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA实现概率计算(数字不同范围按照不同几率产生随机数)

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA实现概率计算(数字不同范围按照不同几率产生随机数) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

程序中經(jīng)常遇到隨機(jī)送紅包之類的情景,這個隨機(jī)還得指定概率,比如10%的機(jī)率可以得到紅包。那么java怎么實(shí)現(xiàn)一個簡單的概率計(jì)算了,見如下例子:

int randomInt = RandomUtils.nextInt(1,101); if(randomInt <= 10){ //100里面1個數(shù),小于等于10的概率就是10%//do something }

RandomUtils工具類是commons-lang3包里面的

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version> </dependency>

?如果要在某個數(shù)字區(qū)間產(chǎn)生一個隨機(jī)數(shù),區(qū)間內(nèi)部在不同的片段幾率不同如何實(shí)現(xiàn)呢?經(jīng)常有這樣的場景,比如,隨機(jī)贈送紅包,范圍0.1元-100元,0.1-1元的概率是90%,1元-10元的概率是9%,10元-100元的概率是1%,也就是說數(shù)額越大得到的幾率越小!實(shí)現(xiàn)的原理如下圖:

原理就是,將范圍分割成一個個子范圍(片段),具體采用哪個范圍,再用機(jī)率判斷。片段機(jī)率可以依次排好序,映射成[1,100]之間的數(shù)字。然后隨機(jī)一個[1,100]之間的數(shù),該數(shù)落在哪個區(qū)間,就采用哪個片段產(chǎn)生隨機(jī)數(shù)。具體源代碼如下:

package com.hdwang;import org.apache.commons.lang3.RandomUtils;import java.util.ArrayList; import java.util.List;/*** 按幾率產(chǎn)生隨機(jī)數(shù)* 例如,產(chǎn)生0.1-100的隨機(jī)數(shù),0.1-1的幾率是90%,1-10的幾率是9%,10-100的幾率是1%*/ public class RateRandomNumber {/*** 產(chǎn)生隨機(jī)數(shù)* @param min 最小值* @param max 最大值* @return 隨機(jī)結(jié)果*/public static double produceRandomNumber(double min,double max){return RandomUtils.nextDouble(min,max); //[min,max] }/*** 按比率產(chǎn)生隨機(jī)數(shù)* @param min 最小值* @param max 最大值* @param separates 分割值(中間插入數(shù))* @param percents 每段數(shù)值的占比(幾率)* @return 按比率隨機(jī)結(jié)果*/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("分割數(shù)字的個數(shù)加1必須等于百分比個數(shù)");}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("分割數(shù)值必須在(min,max)之間");}}int rangeCount = separates.size()+1; //例如:3個插值,可以將一個數(shù)值范圍分割成4段//構(gòu)造分割的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);//片段占比,轉(zhuǎn)換為[1,100]區(qū)間的數(shù)字range.percentScopeMin = scopeMax +1;range.percentScopeMax = range.percentScopeMin + (range.percent-1);scopeMax = range.percentScopeMax;ranges.add(range);}//結(jié)果賦初值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產(chǎn)生最終的隨機(jī)數(shù)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; //百分比轉(zhuǎn)換為[1,100]的數(shù)字的最小值public int percentScopeMax; //百分比轉(zhuǎn)換為[1,100]的數(shù)字的最大值 }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));}} }

?

轉(zhuǎn)載于:https://www.cnblogs.com/hdwang/p/9172172.html

總結(jié)

以上是生活随笔為你收集整理的JAVA实现概率计算(数字不同范围按照不同几率产生随机数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。