1.经典概率算法抽奖

$tmpItems = ['电脑'=>10, '相机'=>50, '100元现金'=>500];
$proSum = array_sum($tmpItems);
foreach ($tmpItems as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur) {
$resultId = $key;
break;
} else {
$proSum -= $proCur;
}
}

从count($tmpItems)总样本中随机一个数,循环的判断是否小于currentValue,小于便是中奖,大于就从总样本中扔掉currentValue ,继续循环产生随机数判断概率是否落入小于currentValue区间内。

封装为函数,支持概率为小数点 (小数点位数越多数据量越大)

function get_prize($prizeItems) {
$resultId = '';
$dec = explode('.', strval(min($prizeItems))); # 小数点拆分
$dec_len = isset($dec[1]) ? strlen($dec[1]) : ''; #小数点后长度
$radix = 1; # 乘积的基数
if ($dec_len) {
for ($i = 1; $i <= $dec_len; $i++) {
$radix*=10;
}
}
$tmpItems = [];
foreach ($prizeItems as $key => $value) {
$tmpItems[$key] = $value * $radix;
}
$proSum = array_sum($tmpItems);
foreach ($tmpItems as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur) {
$resultId = $key;
break;
} else {
$proSum -= $proCur;
}
}
return $resultId;
} /**
* 电脑 概率为0.02% 十万分之二
* 相机 概率为0.2% 万分之二
* 100元现金 概率为1.8% 百分之一点八
* 德芙巧克力 概率为40% 十分之四
* 谢谢参与 概率为57.98% 百分之五十七点九八
*/
$prizeItems = ['电脑' => 0.0002, '相机' => 0.002, '100元现金' => 0.018,'德芙巧克力'=>0.4,'谢谢参与'=>0.5798];
print_r(get_prize($prizeItems));

2.全概率样本抽奖

php抽奖代码的更多相关文章

  1. js手机号批量滚动抽奖代码实现

    我们平时在看一些选秀节目或一些歌唱类比赛节目时经常会看到在现场的大屏幕上会有观众的手机号在滚动来选出谁是幸运观众或谁中了什么奖项,这些手机号都是现场观众或场外观众在给选手投票时产生的,当主持人一声开始 ...

  2. jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码

    需求: 抽奖代码最多可以抽奖5次,而且,每次只会中“2000元理财金”或者“谢谢参与”,其它的不会抽中(哈哈,果然都是套路). 效果如下: 一.页面结构: ? 1 2 3 4 5 6 7 8 9 10 ...

  3. javascript 转盘抽奖代码和计数器代码

    要介绍了javascript圆盘抽奖程序实现原理和完整代码例子,需要的朋友可以参考下  看到网页上有不少大转盘抽奖的应用,心血来潮也想弄个.于是找了点资料自己研究...  效果预览: 一.模拟抽奖的实 ...

  4. jQueryRotate 转盘抽奖代码实现

    代码如下: 例子兼容IE6,7,8 以及高版本浏览器,如有bug请回复! 1.html结构 <!doctype html> <html lang="en"> ...

  5. html 抽奖代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. php实现概率性随机抽奖代码

    1.初始数据: 权重越大,抽取的几率越高 [奖品1, 权重 5], [ 奖品2, 权重6], [ 奖品3, 权重 7], [ 奖品4, 权重2] 2.处理步骤: 1)N = 5 + 6 + 7 + 2 ...

  7. php按照奖品百分比随机抽奖代码分析

    这个忘记从哪里copy过来了 /** * 概率算法 * @param array $probability * @return integer|string */ function get_rand( ...

  8. PHP抽奖代码。亲测可用

    $prize_arr = array( '0' => array('id' => 1, 'title' => 'iphone5s', 'v' => 5), '1' => ...

  9. HTML5 Canvas绘制转盘抽奖

    新项目:完整的Canvas转盘抽奖代码 https://github.com/givebest/GB-canvas-turntable 演示 http://blog.givebest.cn/GB-ca ...

随机推荐

  1. 配置LVS + Keepalived高可用负载均衡集群之图文教程

    负载均衡系统可以选用LVS方案,而为避免Director Server单点故障引起系统崩溃,我们可以选用LVS+Keepalived组合保证高可用性.  重点:每个节点时间都同步哈! C++代码 [r ...

  2. linux 查找文件或目录

    find / -maxdepth 2 -name "vmware*"在根目录/ 2层深度下搜索以vmware打头的文件或者目录

  3. [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF

    遇到这两个错误,是因为Git的换行符检查功能. core.safecrlf Git提供了一个换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符.这个功能的选项 ...

  4. git pull和git fetch的区别

    Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

  5. 神经网络模型及R代码实现

    神经网络基本原理 一.神经元模型 图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值 ( threshold ),或称为偏置( bias ).则神 ...

  6. 个人对RCU的理解

    本文对于RCU的概念不进行解释. 考虑一种比较让人困惑的情形,就是在grace period期间,有新的读者进入,那么这个读者拿到的是新数据还是旧数据,查阅了很多资料都没找到答案,当然对于链表的情况这 ...

  7. Session 潜在bug防范

    注意: Session的使用一定要及时的清理,因为它是“全局”的(包括其生命周期),所以在使用Session保存状态时,不用时要及时的NULL掉,小心潜在的Bug.

  8. ASP.NET知识总结 (未完) 本人新手

    1:HTTP的工作方式是什么?1)客户端提交表单请求处理 Request2)服务器端处理程序进行处理 Handle3)服务端相应 Response 2:1)get(默认值)是通过地址栏的URL显式地传 ...

  9. CSS3教程:box-sizing属性的理解

    说到 IE 的 bug,一个臭名昭著的例子是它对于“盒模型”的错误解释:在 IE5.x 以及 Quirks 模式的 IE6/7 中,将 border 与 padding 都包含在 width 之内.这 ...

  10. Oracle常用语法

    Oracle常用语句语法汇总 Oracle10g 1 第一章Oracle命令 a) 系统管理员连接 conn */* as sysdba b) 查询当前用户 show user c) 创建新用户 cr ...