# 抽奖算法 原

来自猩猩的茶

``````<?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;``````

### 来自猩猩的茶

DemonsI
09/29
0
0
php几个常用的概率算法（抽奖、广告首选）

2015/07/22
0
0

2015/07/06
0
0
Java抽奖抢购算法

2016/07/28
218
0

2014/08/29
1K
5

go4it

3
0

em_aaron

4
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

3
0

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 \$("#...

donald121

3
0
Android SELinux avc dennied权限问题解决方法