PHP 與 JS 中獎機率算法

經典的機率算法。php

如今有數組:[10, 20, 30, 40] 。算法

假設對應中獎概率:特等獎10%,一等獎20%,二等獎30%,三等獎40%,總共100%。數組

算法開始時,從數組中選出一個值$value,再從1-100機率空間內隨機選出一個數$rand。dom

比較$value和$rand,若是$rand在$value機率範圍以內,則直接返回$value對應的key。code

若是不在,則將機率空間的值減去$value值。ip

在本例中,第一次判斷以後,就是減去10,也就是說第二次是在1-90這個範圍內篩選的。get

這樣篩選到最後,總會有一個數知足要求。it

就至關於去一個箱子裏摸東西,io

第一個不是,第二個不是,第三個還不是,那最後一個必定是。function

這個算法簡單,並且效率很是高。

PHP實現
<?php
    function getRand($arr)
    {
        $result = '';
        //機率數組的總機率精度
        $sum = array_sum($arr);
        //機率數組循環
        foreach ($arr as $key => $value) {
            $rand = mt_rand(1, $sum);
            if ($rand <= $value) {
                $result = $key;
                break;
            } else {
                $sum -= $value;
            }
        }
        unset ($arr);
        return $result;
    }
使用範例:

$a = [10, 20, 30, 40];
// 輸出3的機率最大
echo 'PHP:' . getRand($a);
Javascript實現
<script>
    function getRand(arr) {
        var result = 0;
        var sum = arr.reduce(function(a, b) {
            return a + b;
        });

        for (index in arr) {
            rand = Math.round(Math.random() * (sum - 1) + 1);
            if (rand <= arr[index]) {
                return index;
            } else {
                sum -= arr[index];
            }
        }

        return result;
    }

    // 使用示例,輸出2的機率最大
    var a = [10, 20, 30, 40];
    document.write('<br />Javascript:' + getRand(a));
</script>
使用範例:

    // 使用示例,輸出3的機率最大
    var a = [10, 20, 30, 40];
    document.write('<br />Javascript:' + getRand(a));
相關文章
相關標籤/搜索