文档章节

抽奖算法

来自猩猩的茶
 来自猩猩的茶
发布于 2013/11/02 12:36
字数 373
阅读 551
收藏 2
<?php

/**
 * 抽奖函数升级版,可排除若干奖项
 */
class Lottery {

    static public $rate;
    static public $ignore;

    /**
     * 
     * @param type $rate 概率设置
     * @param type $ignore 忽略的奖项
     * @return 调用实例化后的对象方法
     * @example Lottery::runOnce(array(20, 10, 10, 10), array(0));
     */
    static public function runOnce($rate = array(10, 10, 10, 10), $ignore = array()) {
        self::$rate = $rate;
        self::$ignore = $ignore;
        $obj = new self;
        return $obj->lotteryProcess();
    }

    /**
     * 处理抽奖
     * @return type
     */
    public function lotteryProcess() {
        $rateSum = array_sum(self::$rate); //概率之和
        //考虑用户输入的概率之和不等于100
        if ($rateSum < 100) {
            array_push(self::$rate, 100 - $rateSum);
        } elseif ($rateSum > 100) {
            die('The rate sum over 100%!');
        }
        //处理忽略奖项
        $rateCount = count(self::$rate);
        foreach (self::$rate as $key => $value) {
            if (in_array($key, self::$ignore)) {
                self::$rate[$rateCount - 1]+=self::$rate[$key];
                self::$rate[$key] = 0;
            }
            $seedRaw[$key] = self::$rate[$key] * 100; //概率放大100被备用
        }
        $seed = $this->arraySum($seedRaw); //处理数组
        $randVal = mt_rand(0, 10000);
        return $this->judge($seed, $randVal);
    }

    /**
     * 从0-10000重新组织数组,每个值为之前各项的累加
     * @param array $seedRaw
     * @return array
     */
    private function arraySum(array$seedRaw) {
        foreach ($seedRaw as $key => $value) {
            $tmpSum = 0;
            for ($i = 0; $i < $key; $i++) {
                $tmpSum+=$seedRaw[$i];
            }
            $seed[$key] = $tmpSum;
        }
        array_push($seed, 10000);
        return $seed;
    }

    /**
     * 根据随机值判断此次中了第几个奖项
     * @param type $seed
     * @param type $rand
     * @return int
     */
    private function judge($seed, $rand) {
        array_push($seed, NULL); //凑数
        for ($i = 0; $i < count($seed) - 1; $i++) {

            if ($rand >= $seed[$i] && $rand < $seed[$i + 1]) {
                return $i;
            }
        }
    }

}

ini_set('display_errors', 'on');

$l0 = 0;
$l1 = 0;
$l2 = 0;
$l3 = 0;
$l4 = 0;
$l5 = 0;
for ($i = 0; $i <= 10000; $i++) {
    $result = Lottery::runOnce(array(20, 10, 10, 10), array(0, 1));
    if ($result === 0)
        $l0++;
    if ($result == 1)
        $l1++;
    if ($result == 2)
        $l2++;
    if ($result == 3)
        $l3++;
    if ($result == 4)
        $l4++;
}
echo '0:' . $l0 . '<br/>1:' . $l1 . '<br/>2:' . $l2 . '<br/>3:' . $l3 . '<br/>4:' . $l4;

© 著作权归作者所有

共有 人打赏支持
来自猩猩的茶
粉丝 2
博文 10
码字总数 3751
作品 0
长宁
部门经理
php几个常用的概率算法(抽奖、广告首选)

做网站类的有时会弄个活动什么的,来让用户参加,既吸引用户注册,又提高网站的用户活跃度。同时参加的用户会获得一定的奖品,有100%中奖的,也有按一定概率中奖的,大的比如中个ipad、iphon...

蜗牛奔跑
2015/07/22
0
0
幸运大转盘-jQuery+PHP实现的抽奖程序

目前好多网站上应用的转盘抽奖程序大多是基于flash的,而本文结合实例将使用jQuery和PHP来实现转盘抽奖程序,为了便于理解,作者分两部分来讲解,本文讲解第一部分,侧重使用jQuery实现转盘的...

蜗牛奔跑
2015/07/06
0
0
Java抽奖抢购算法

表结构 代码实现 应用场景 单件奖品抢购(可限时) 多件奖品按概率中奖(可限时、可不限量)

天蓝1122
2016/07/28
218
0
一般活动的抽奖算法的问题

一个抽奖活动设定 一等奖:1/1000 二等奖:10/1000 三等奖:100/1000 如所有奖品都能中的情况下 因该是抽奖1000次还是抽奖3000次呢?? 111/1000的中奖率?还是111/3000的中奖率?? 求教.....

风弥
2014/08/29
1K
5
[分享] 来,做一个问卷调查(有抽奖!)

前言 “小王,明天公司在***举办一个xxx产品发布会,你今天准备2000份问卷调查。还有,我们这次还做一个抽奖活动,也记得弄一个抽奖箱和一些抽奖球哦。” …… 活动结束了,小王想起早上捧着...

没错就是酱紫
2016/07/28
90
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
68
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部