php 概率算法(转)

例: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;
}

$prize_arr 是一个二维数组,记录了所有本次抽奖的奖项信息,其中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‘=>‘优盘‘,‘v‘=>12),
    ‘4‘ => array(‘id‘=>5,‘prize‘=>‘Q币‘,‘v‘=>22),
    ‘5‘ => array(‘id‘=>6,‘prize‘=>‘加油‘,‘v‘=>50),
);  

每次前端页面的请求,PHP循环奖项设置数组,通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res[‘yes‘]中,而剩下的未中奖的信息保存在$res[‘no‘]中,最后输出json个数数据给前端页面。

//如果中奖数据是放在数据库里,这里就需要进行判断中奖数量
//在中1、2、3等奖的,如果达到最大数量的则unset相应的奖项,避免重复中大奖
//code here eg:unset($prize_arr[‘0‘])
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;
echo json_encode($res);   
时间: 2024-10-06 05:14:21

php 概率算法(转)的相关文章

数值概率算法(转 用来说明算法导论题目!!!)

随机化算法(2) — 数值概率算法 接着上一篇: 随机化算法(1) — 随机数 在这章开篇推荐下chinazhangjie总结的随机算法,因为咱两看的是同一本书,所以大家也可以去参考下他的,总结的很不错. http://www.cnblogs.com/chinazhangjie/archive/2010/11/11/1874924.html (顺便再PS一下,小杰也是我论坛的C/C++问题求助板块的版主,C/C++小牛) 这一章我就把书中的一个例子举出来了,感觉虽然很简单,但是很有意思. 用随机

有趣的概率算法--生日悖论

在算法导论书上看到个比较有意思的概率算法,在这里加上自己的理解分享下: 上次刚看同学发的朋友圈说道:“两个人同一间宿舍,而且同年同月同日生,这个缘分真的是醉了”,当时我也是醉醉的,看了这个算法后才发现,屋里有23个人,那么就可以50%的概率生日是一样的. 是这样子证明的: 首先,假设屋子里有K个人,分别对他们编号1,2,3….k号.不考虑闰年的情况,那么一年就有n=365天,首先还是要假设生日是均匀分布在一年的n天中(喜欢在春天生就都在春天生这就不均匀了),然后还要假设两个人生日相互独立(什么双

中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)

php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300,400), * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内, * 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间, * 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的. * 这样 筛选到最终,总

概率算法 蒙特卡罗算法

/***Date:2014.12.11***/ //概率算法思想:统计学思路. //基本过程:1)将问题转化为应的容易计算面积的几何图形S,问题结果对应几何图形中的某一部分S1: ////////////2)向几何图形中随机撒点: ////////////3)统计几何图形S.S1中的点数,根据二者面积关系以及二者中的点数来计算得到结果: ////////////4)判断结果是否达到需要精度结果,若符合则输出,否则继续(2)步骤. //蒙特卡罗(Monte Carlo)算法 //均匀撒点:利用随机

php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 <!--?

关于概率算法的问题,不知道逻辑错在哪里,求debug

做个骰子成功几率的分析,投n颗骰子,第一次投成功的几率是a,然后投成功的骰子,需要再投1次,这次成功的几率是b.第二次成功的骰子才算最终成功. 要分析出n颗骰子,最终成功0到n颗的概率. 我写了个算法,求出的结果,合计0到n颗的概率不近似1,而且差别很大,求教各位大大算法有什么错误. 我算法的基本思路: 先统计出第一次投成功0-n颗骰子的概率列表.这步我自认没有问题,合计验算结果近似1 for (var i = 0; i <= n; i++){ FirstSuccessRateTbl.Add(i

适用于抽奖程序 随机广告的PHP概率算法实例

做网站类的有时会弄个活动什么的,来让用户参加,既吸引用户注册,又提高网站的用户活跃度.同时参加的用户会获得一定的奖品,有100%中奖的,也有按一定概率中奖的,大的比如中个ipad.iphone5,小的中个Q币什么的 那么我们在程序里必然会设计到算法,即按照一定的概率让用户获得奖品.先来看两个概率算法函数. 算法一 代码如下: /** * 全概率计算 * * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4) * @return string

php抽奖概率算法

$arr=array(    5=>'奖项一',    10=>'奖项二',    60=>'奖项三',    25=>'奖项四'); $pool=array(); foreach($arr as $k=>$v){ echo count($pool).'<br>'; $pool+=array_fill(count($pool),$k,$v); }echo '<pre>';print_r($pool);echo $pool[rand(0,99)]; ph

概率算法

昨天想写一个抽奖类来玩玩.结果确没有思路,于是网上找了一个dome.参考学习之后发现最主要的是概率的计算.于是学习了一个. 改方法主要是将所有奖品概率随机一个数,来决定中奖奖品.通过循环来判断随机数是否为中奖奖品,如果不是,去掉该奖品重新判断. /** * 概率算法 * @access public * @param array $arr 数组,奖品的id和概率 * @return int */ function rand($arr){ $result = ''; $porsum = array

paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.

#---抽奖算法需要满足的需求如下: 1 #---抽奖核心流程 1 #---问题???更好的算法 2 #---实际使用的扩展抽奖算法(带奖品送完判断和每用户最大中奖判断) 2 #-------网上的抽奖算法Php 3 #----java版本的.. 4 参考 5 #---抽奖算法需要满足的需求如下: 1.可以控制中奖的概率 2.具有随机性 3.最好可以控制奖品的数量 4.根据用户ID或者ip.手机号.QQ号等条件限制抽奖次数 初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面