zoukankan      html  css  js  c++  java
  • PHP和JavaScript中奖概率算法

    这是一个经典的概率算法。

    现在有数组:[10, 20, 30, 40]

    假设对应中奖几率:特等奖10%,一等奖20%,二等奖30%,三等奖40%,总共100%

    算法开始时,从数组中选出一个值$value,再从1-100概率空间内随机选出一个数$rand

    比较$value$rand,如果$rand$value概率范围之内,则直接返回$value对应的key。

    如果不在,则将概率空间的值减去$value值。

    在本例中,第一次判断之后,就是减去10,也就是说第二次是在1-90这个范围内筛选的。

    这样筛选到最后,总会有一个数满足要求。

    就相当于去一个箱子里摸东西,

    第一个不是,第二个不是,第三个还不是,那最后一个一定是。

    这个算法简单,而且效率非常高。

    1. 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;
        }

    2. 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>
  • 相关阅读:
    maven 配置报错 JAVA_HOME not found in your environment
    file控件change事件触发问题
    自己动手写easyui的checkbox
    json数组传递到后台controller
    yii2 添加模块过程
    YII框架中php入口文件隐藏
    YII框架路由和URL生成
    Node.js脚本杀掉占用端口的进程
    Java单例模式的6种写法
    HTTPS时代已来,你做好准备了吗?
  • 原文地址:https://www.cnblogs.com/phpfensi/p/8980153.html
Copyright © 2011-2022 走看看