PHP和JavaScript中奖概率算法
2024-09-01 18:56:27
这是一个经典的概率算法。
现在有数组:[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>
最新文章
- tinymce整合struts2使用
- jquery Ajax异步请求之session
- mysql数据库默认存放位置修改
- python--httplib模块使用
- Oracle学习之集合运算
- Android实例-消息框(XE8+小米2)
- Oracle行转列的函数
- curl 提交请求
- UVa 121 - Pipe Fitters
- 【C++知识汇总】运营商 &;amp; 运算符重载
- Mysql高级之主从复制
- 图像旋转、伸缩的自写matlab实现
- input只能输入数字字母
- 20155208徐子涵 《网络对抗技术》Web基础
- Linux查看机器的硬件信息
- Python笔记(十三):urllib模块
- python set集合一些基本方法
- 应用多种变形CSS3
- gff/gtf格式
- 洛咕 P2463 [SDOI2008]Sandy的卡片