当前位置:  编程技术>php

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

    来源: 互联网  发布时间:2014-08-26

    本文导语:  那么我们在程序里必然会设计到算法,即按照一定的概率让用户获得奖品。先来看两个概率算法函数。 算法一 代码如下:/** * 全概率计算 * * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4) * @return string 返回上面数组的key */function rando...

那么我们在程序里必然会设计到算法,即按照一定的概率让用户获得奖品。先来看两个概率算法函数。

算法一

代码如下:

/**
 * 全概率计算
 *
 * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4)
 * @return string 返回上面数组的key
 */
function random($ps){
    static $arr = array();
    $key = md5(serialize($ps));

    if (!isset($arr[$key])) {
        $max = array_sum($ps);
        foreach ($ps as $k=>$v) {
            $v = $v / $max * 10000;
            for ($i=0; $i $proCur) {
        $randNum = mt_rand(1, $proSum);
        if ($randNum 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),
);

 
中是一个二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。
每次前端页面的请求,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


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求教!!!jsp中多重查询该怎么做??什么算法最适用?最高效???
  • 使用原始套接字来发送一个icmp包,不适用setsockopt做控制会怎么样?
  • 请问私有的构造器有何意义,即适用于什么样的场合?
  • 谁能说一说JSP和SERVLET的区别,及适用场合
  • 想问 现在主流的Linux 认证有哪几种?它们的适用对象?在广州哪里有好的相关培训中心?
  • 请问linux编程方面有哪些经典书籍(适用于初学者),包括英文版!!!!给分!!!
  • 如何生成适用于各种平台的.a库
  • 安装双系统,linux哪个版本较适用,主要是学习linux
  • Oracle删除当前用户下所有表的方法适用于有或没有删除权限
  • 请问linux安装在创建交换分区时,挂载点选择什么?我没有选,出现的是灰色的<不适用>,有问题吗?
  • 谁能告诉我EJB与一般java bean的区别和适用范围?
  • jQery使网页在显示器上居中显示适用于任何分辨率
  • 一个Linux系统安全设置的Shell脚本的分享(适用CentOS)
  • Oracle中Union与Union All的区别(适用多个数据库)
  • PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3