輪盤賭算法


首先,這個算法可以如下表述:

如果已知A類對象生成概率為P(A),B類對象生成概率為P(B),C類對象···,K類對象,他們的概率總和為1,問如何在A~K中隨機生成一個對象

算法理解如下:

輪盤賭圖1

即我們需要先對0~1區段按照概率大小划分長度,設隨機生成一個0~1之間的數,這種隨機數生成結果是在0~1均勻分布的,然后看其究竟落在哪個概率區段即為生成哪種對象

算法代碼:

package test;

import org.junit.Test;

public class Roulette {

    @Test
    public  void test() {
        double[] P={0.2,0.3,0.5};//假設的概率分布
        int appearnum=0;
        for(int i=0;i<100;i++){
            int result=roulette(P);
            if(result==2)//統計第2類對象生成的數目,可以看出大致為50%的生成概率
                appearnum++;
        }
        System.out.println(appearnum);
    }
    /**
     * 輪盤賭函數
     * @param P 各類對象概率分布
     * @return 生成的對象類
     */
    private int roulette(double[] P){
        
        double rand=Math.random();
        double pointer=0;//pointer指示每個區段的右邊界,從左往右掃描判斷
        for(int i=0;i<P.length;i++){
            pointer+=P[i];
            if(rand<=pointer)
                return i;
        }
        return -1;
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM