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>
php资料
分类:
PHP, javascript
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 基于.net6的一款开源的低代码、权限、工作流、动态接口平台
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· Claude Code 初体验 - Windows
· LinqPad:C#代码测试学习一品神器
· .NET 8 gRPC 实现高效100G大文件断点续传工具