一個經典概率算法(用於抽獎等場景)


假設有一個數組[100,400,200,300],它的意思是,總數是100+400+200+300=1000. 取到第一個數的概率是100/1000,取到第二個數的概率是400/1000......代碼如下:

            function getResult(arr){
                var leng = 0;
                for(var i=0; i<arr.length; i++){
                    leng+=arr[i]                                     //獲取總數
                }
                for(var i=0; i<arr.length; i++){
                    var random = parseInt(Math.random()*leng);       //獲取 0-總數 之間的一個隨隨機整數 if(random<arr[i]){
                        return i                                     //如果在當前的概率范圍內,得到的就是當前概率
                    }
                    else {
                        leng-=arr[i]                                 //否則減去當前的概率范圍,進入下一輪循環
                    }
                }
            }    

下面來解釋一下這個算法,把數組抽象出來,假設為a,b,c,d,這四個概率數,那么,他們的總和就是 a+b+c+d. 畫成數軸:

從0-(a+b+c+d) 中取一個隨機數,數字落在對應的空間里,取到的就是對應的概率.

第一次循環取數,有兩個可能: 

<a    或者    >a: 

如果是第一種可能,那就直接是概率a/(a+b+c+d),得到的對應結果就是a.直接返回.

如果是第二種可能,那么概率應該是(b+c+d)/(a+b+c+d).然后進入第二次循環,第二次取數我們把a的概率空間減去,得到新的數軸:

新的數軸以原來的a為原點0,后面不變.這時候,總和變成 b+c+d.

從 0-(b+c+d) 中取一個隨機數,數字落在對應的空間里,取到的就是對應的概率.

同樣有兩個可能: 

<b    或者     >b

如果是第一種,那么它的概率就是 b/(b+c+d). 注意,這個概率出現的前提是第一次的結果是 >a ,所以總概率就是兩次乘積: (b+c+d)/(a+b+c+d) * b/(b+c+d) 得到的結果是 b/(a+b+c+d),得到的對應結果就是b.返回.

如果是第二種,那么它的概率就是 (c+d)/(b+c+d). 同樣,和 >a 的結果同時出現,這種情況的總概率應該是: (b+c+d)/(a+b+c+d) * (c+d)/(b+c+d) 得到的結果是(c+d)/(a+b+c+d).然后進入第三次循環,然后第三次循環時,我們再把b的概率空間減去............以此類推.............

這樣直到最后...總能取到一個概率值...

 

這個算法可以用在抽獎上,比如有這樣一組獎品和對應的概率:

 

       var gifts = [
                {
                    "name":"mac",
                    "prop":1
                },
                {
                    "name":"紅米",
                    "prop":10
                },
                {
                    "name":"u盤",
                    "prop":40
                },
                {
                    "name":"香皂",
                    "prop":49
                }
            ];

 

就可以用前面的函數來進行抽獎:

            var gArr = [];
            for(var i=0; i<gifts.length; i++){
                gArr.push(gifts[i]['prop'])
            }
            console.log(gifts[getResult(gArr)]['name'])    

源文件下載:http://pan.baidu.com/s/1oeOG2

非轉載,親測可行~~~

 


免責聲明!

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



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