JAVA中怎么實現(xiàn)一個概率計算,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)松溪免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
程序中經(jīng)常遇到隨機送紅包之類的情景,這個隨機還得指定概率,比如10%的機率可以得到紅包。那么java怎么實現(xiàn)一個簡單的概率計算了,見如下例子:
int randomInt = RandomUtils.nextInt(1,101);if(randomInt <= 10){ //100里面1個數(shù),小于等于10的概率就是10% //do something}
RandomUtils工具類是commons-lang3包里面的
org.apache.commons commons-lang3 3.7
如果要在某個數(shù)字區(qū)間產(chǎn)生一個隨機數(shù),區(qū)間內(nèi)部在不同的片段幾率不同如何實現(xiàn)呢?經(jīng)常有這樣的場景,比如,隨機贈送紅包,范圍0.1元-100元,0.1-1元的概率是90%,1元-10元的概率是9%,10元-100元的概率是1%,也就是說數(shù)額越大得到的幾率越??!實現(xiàn)的原理如下圖:
原理就是,將范圍分割成一個個子范圍(片段),具體采用哪個范圍,再用機率判斷。片段機率可以依次排好序,映射成[1,100]之間的數(shù)字。然后隨機一個[1,100]之間的數(shù),該數(shù)落在哪個區(qū)間,就采用哪個片段產(chǎn)生隨機數(shù)。具體源代碼如下:
package com.jeeplus.common.utils;import org.apache.commons.lang3.RandomUtils;import java.util.ArrayList;import java.util.List;/** * 按幾率產(chǎn)生隨機數(shù) * 例如,產(chǎn)生0.1-100的隨機數(shù),0.1-1的幾率是90%,1-10的幾率是9%,10-100的幾率是1% */public class RateRandomNumber {/** * 產(chǎn)生隨機數(shù) * @param min 最小值 * @param max 最大值 * @return 隨機結(jié)果 */ public static double produceRandomNumber(double min,double max){return RandomUtils.nextDouble(min,max); //[min,max] }/** * 按比率產(chǎn)生隨機數(shù) * @param min 最小值 * @param max 最大值 * @param separates 分割值(中間插入數(shù)) * @param percents 每段數(shù)值的占比(幾率) * @return 按比率隨機結(jié)果 */ public static double produceRateRandomNumber(double min,double max,Listseparates,List 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 ranges = new ArrayList ();int scopeMax = 0;for(int i=0;i separates = new ArrayList (); separates.add(1.0); separates.add(10.0); List percents = new ArrayList (); 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)); } } }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。