这是一个很经典的概率算法函数:

function get_rand($proArr) {
$result = '';
//概率数组的总概率精度
$proSum = array_sum($proArr);
//概率数组循环
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum); //抽取随机数
if ($randNum <= $proCur) {
$result = $key; //得出结果
break;
} else {
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}

假设:我们有这样一个数组:a奖概率20%,b奖概率30%,c奖概率50%

$prize_arr =array('a'=>20,'b'=>30,'c'=>50);

模拟函数执行过程:

总概率精度为20+30+50=100

第一次数组循环,$procur=20

假设抽取的随机数rand(1,100),假设抽到$randNum=55

if判断-------

如果$randNum<=20,则result=a

否则进入下一循环,总概率精度变为100-20=80

第二次数组循环,$procur=30

假设抽取的随机数rand(1,80),假设抽到$randNum=33

if判断---------

如果$randNum<=30,则result=b

否则进入下一循环,总概率精度变为80-30=50

第三次数组循环,$prosur=50;

假设抽取的随机数rand(1,50),不管怎么抽,随机数都会<或=50,

那么得出result=c;

因为样本没有改变,虽然可能抽取的随机数不止一个,但是概率是不变的。

或者也可以这样:

    function get_rand($arr)
{
$pro_sum=array_sum($arr);
$rand_num=mt_rand(1,$pro_sum);
$tmp_num=0;
foreach($arr as $k=>$val)
{
if($rand_num<=$val+$tmp_num)
{
$n=$k;
break;
}else
{
$tmp_num+=$val;
}
}
return $n;
}

http://denghai260.blog.163.com/blog/static/7268640920128244332285/

最新文章

  1. mina框架详解
  2. 《C与指针》第十二章练习
  3. html中input文本框,初始里边有文字提示,当点击时,文字消失,怎么设置?
  4. 在项目中引用GreenDroid库
  5. 上传Android代码到Jcenter(解决了字符映射的问题)
  6. iOS获取的NSDate date时间与实际相差8个小时
  7. C#中的WebBrowser控件加载ActiveX插件
  8. PHP 关于 $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]
  9. BeanUtils的日期问题
  10. poj1173 解题报告
  11. elk集成安装配置
  12. python教你用微信每天给女朋友说晚安
  13. MySQL入门介绍(mysql-8.0.13)
  14. java虚拟机的堆内存配置
  15. 547. Friend Circles
  16. 路由器桥接尝试WDS
  17. 用vue-cli脚手架搭建一个仿网易云音乐的全家桶vue项目
  18. python的队列和栈
  19. The Little Prince-12/02
  20. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

热门文章

  1. HDU 6119 小小粉丝度度熊 双指针
  2. VMware无法识别USB设备
  3. Matcher匹配器查找字符串指定内容
  4. hive学习(二) hive操作
  5. 初次接触express
  6. [前端随笔][CSS] 制作一个加载动画 即帖即用
  7. 通过kubeadm安装kubernetes 1.7文档记录[docker容器方式]
  8. NOI2014 魔法森林 day1t2 SPFA
  9. 六十二 Web开发 使用模板
  10. hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)