lottery.php


<?php
//转自https://segmentfault.com/a/1190000007431893
/*
* 不同概率的抽奖原理就是把0到*(比重总数)的区间分块
* 分块的依据是物品占整个的比重,再根据随机数种子来产生0-* 中的某个数
* 判断这个数是落在哪个区间上,区间对应的就是抽到的那个物品。
* 随机数理论上是概率均等的,那么相应的区间所含数的多少就体现了抽奖物品概率的不同。
*/
function get_rand($proArr)
{
$result = array();
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
$proSum = array_sum($arr); // 计算总权重
$randNum = mt_rand(1, $proSum);
$d1 = 0;
$d2 = 0;
for ($i=0; $i < count($arr); $i++) {
$d2 += $arr[$i];
if ($i==0) {
$d1 = 0;
} else {
$d1 += $arr[$i-1];
}
if ($randNum >= $d1 && $randNum <= $d2) {
$result = $proArr[$i];
}
}
unset($arr);
return $result;
} /*
* 使用较多的为这个方法
*/
function get_rand1($proArr)
{
$result = array();
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
// 概率数组的总概率
$proSum = array_sum($arr);
asort($arr);
// 概率数组循环
foreach ($arr as $k => $v) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $v) {
$result = $proArr[$k];
break;
} else {
$proSum -= $v;
}
}
return $result;
} /*
* 奖项数组
* 奖品id,名称,比重
*/
$arr = array(
array('id'=>1,'name'=>'特等奖','v'=>1),
array('id'=>2,'name'=>'一等奖','v'=>5),
array('id'=>3,'name'=>'二等奖','v'=>10),
array('id'=>4,'name'=>'三等奖','v'=>12),
array('id'=>5,'name'=>'四等奖','v'=>22),
array('id'=>6,'name'=>'没中奖','v'=>50)
); //测试结果(10000次):
get_rand():
//count_1:0 count_2:490 count_3:1021 count_4:1172 count_5:2172 count_6:5145
//特等奖中奖率全为:0
get_rand1():
//count_1:92 count_2:477 count_3:1017 count_4:1195 count_5:2264 count_6:4955
//总体感觉 get_rand1() 更准确些......

最新文章

  1. Python 文件操作函数
  2. Android开发环境建立
  3. 转js中this指向的简明解答
  4. JSON字符串——后台解析系列
  5. “SQLServerAgent当前未运行”问题解决
  6. linux系统中grub配置文件
  7. (剑指Offer)面试题32:从1到n整数中1出现的次数
  8. NFC(3)Android上的NFC,开启NFC,3种NDEF数据
  9. Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)
  10. 离线安装maven,重新打开eclipse报错处理方法
  11. HTML <center> 标签
  12. java-IO操作性能对照
  13. PHP防止SQL注入和XSS攻击
  14. java通过数据库连接池链接oracle
  15. jquery获取元素(父级的兄弟元素的子元素)
  16. 提交变更(git commit)
  17. module.exports与exports,export与export default之间的关系和区别
  18. 在ubuntu16.04中初次体验.net core 2.0
  19. Linux生成私钥和公钥免密连接
  20. HIVE中IN的坑

热门文章

  1. Django之ORM查询优化
  2. Logback 日志组件的使用
  3. Poj 2559 最大矩形面积 v单调栈 分类: Brush Mode 2014-11-13 20:48 81人阅读 评论(0) 收藏
  4. Python学习day09 - Python进阶(3)
  5. 慢日志:mysqlsla
  6. python基础数据类型初始,用户交互
  7. Frame用navigate导航到新页面后导航条隐藏的方法
  8. 初学C#的简单编程题合集(更新)
  9. 基于httpd2.2配置https
  10. php filemtime filectime fileatime的区别