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

假设:我们有这样一个数组: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;
    }
时间: 2024-10-06 10:13:44

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号等条件限制抽奖次数 初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面