溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JAVA中怎么實(shí)現(xiàn)一個(gè)概率計(jì)算

發(fā)布時(shí)間:2021-07-01 15:30:12 來源:億速云 閱讀:1221 作者:Leah 欄目:編程語言

JAVA中怎么實(shí)現(xiàn)一個(gè)概率計(jì)算,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

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

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

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

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

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

JAVA中怎么實(shí)現(xiàn)一個(gè)概率計(jì)算

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

package com.jeeplus.common.utils;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ù)字的個(gè)數(shù)加1必須等于百分比個(gè)數(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個(gè)插值,可以將一個(gè)數(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);//判斷使用哪個(gè)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));
        }
    }
}

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI