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));
相关文章
相关标签/搜索