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

现在有数组:[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>

最新文章

  1. tinymce整合struts2使用
  2. jquery Ajax异步请求之session
  3. mysql数据库默认存放位置修改
  4. python--httplib模块使用
  5. Oracle学习之集合运算
  6. Android实例-消息框(XE8+小米2)
  7. Oracle行转列的函数
  8. curl 提交请求
  9. UVa 121 - Pipe Fitters
  10. 【C++知识汇总】运营商 &amp;amp; 运算符重载
  11. Mysql高级之主从复制
  12. 图像旋转、伸缩的自写matlab实现
  13. input只能输入数字字母
  14. 20155208徐子涵 《网络对抗技术》Web基础
  15. Linux查看机器的硬件信息
  16. Python笔记(十三):urllib模块
  17. python set集合一些基本方法
  18. 应用多种变形CSS3
  19. gff/gtf格式
  20. 洛咕 P2463 [SDOI2008]Sandy的卡片

热门文章

  1. 学习笔记50_mongodb
  2. [考试反思]0714/0716,NOIP模拟测试3/4
  3. 详谈Generator
  4. vue的路由安全验证
  5. Apache安装问题:APR not found
  6. 对于 TCP 三次握手的理解
  7. springboot配置springMVC
  8. ThinkPHP6 核心分析:系统服务
  9. iOS UIKit x Android Widget
  10. MySQL 5.7 - 通过 BINLOG 恢复数据