微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP概率计算函数汇总

其实发这篇博感觉并没有什么用,太简单了,会的人不屑看,不会的人自已动动脑子也想到了。但是看着自已的博客已经这么久没更,真心疼~。粗略算下一篇只有代码的水文,会占用OSC至少十几KB的数据库空间呢,但是,一想到乱弹里的然并卵,也就释然了。

rush:PHP;"> /**

  • 概率计算类
  • 可用于抽奖等
    */
    class Probability
    {
    /**
    • 概率统计数据
    • thing => chance
      */
      var $data = array();
      var $chance_count = 0;

function __construct($initdata = array()){
if(!empty($initdata)){
$this->data = $initdata;
foreach($initdata as $d){
$this->chance_count += $d['num'];
}
}
}

function addData($name,$chance){
$this->data[]=array('name'=>$name,'num'=>$chance);
$this->chance_count += $chance;
}

function getone(){
$index = rand(0,$this->chance_count);
foreach($this->data as $d){
$index = $index-$d['num'];
if($index<=0){
return $d['name'];
}
}
return '';
}
}

/**

  • 使用示例
    */
    $pro=new Probability();
    $pro->addData('iphone',10);
    $pro->addData('watch',30);
    $pro->addData('$18',50);
    $pro->addData('thank you',10);
    $pro->addData('super big',1);
    for($i=0;$i<100;$i++){
    echo $pro->getone()."\n";
    }

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

$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%

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;

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

或者也可以这样:

$val) { if($rand_num<=$val+$tmp_num) { $n=$k; break; }else { $tmp_num+=$val; } } return $n; }

在给大家分享一个抽奖的概率算法

$proCur) { $randNum = mt_rand(1,$proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } unset ($proArr); return $result; }

/*

  • 奖项数组
  • 是一个二维数组,记录了所有本次抽奖的奖项信息,
  • 其中id表示中奖等级,prize表示奖品,v表示中奖概率。
  • 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,
  • 数组中v的总和(基数),基数越大越能体现概率的准确性。
  • 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%,
  • 如果v的总和是10000,那中奖概率就是万分之一了。
  • */
    $prize_arr = array(
    '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),'1' => array('id'=>2,'prize'=>'数码相机','v'=>5),'2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),'3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),'4' => array('id'=>5,'prize'=>'10Q币','v'=>22),'5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),);

/*

  • 每次前端页面的请求,PHP循环奖项设置数组,
  • 通过概率计算函数get_rand获取抽中的奖项id。
  • 将中奖奖品保存在数组$res['yes']中,
  • 而剩下的未中奖的信息保存在$res['no']中,
  • 最后输出json个数数据给前端页面
    */
    foreach ($prize_arr as $key => $val) {
    $arr[$val['id']] = $val['v'];
    }
    $rid = get_rand($arr); //根据概率获取奖项id

$res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项
unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项
shuffle($prize_arr); //打乱数组顺序
for($i=0;$i<count($prize_arr);$i++){
$pr[] = $prize_arr[$i]['prize'];
}
$res['no'] = $pr;
print_r($res['yes']);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐