/*

 * 经典的概率算法,

 * $proArr是一个预先设置的数组,

 * 假设数组为:array(100,200,300,400),

 * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内,

 * 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,

 * 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。

 * 这样 筛选到最终,总会有一个数满足要求。

 * 就相当于去一个箱子里摸东西,

 * 第一个不是,第二个不是,第三个还不是,那最后一个一定是。

 * 这个算法简单,而且效率非常 高,

 * 关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

 */

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;

}

 

 

/*

 * 奖项数组

 * 是一个二维数组,记录了所有本次抽奖的奖项信息,

 * 其中id表示中奖等级,prize表示奖品,v表示中奖概率。

 * 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,

 * 数组中v的总和(基数),基数越大越能体现概率的准确性。

 * 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%,

 * 如果v的总和是10000,那中奖概率就是万分之一了。

 *

 */

$prize_arr = array(

  '0' => 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),

);

 

/*

 * 每次前端页面的请求,PHP循环奖项设置数组,

 * 通过概率计算函数get_rand获取抽中的奖项id。

 * 将中奖奖品保存在数组$res['yes']中,

 * 而剩下的未中奖的信息保存在$res['no']中,

 * 最后输出json个数数据给前端页面。

 */

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<count($prize_arr);$i++){

  $pr[] = $prize_arr[$i]['prize'];

}

$res['no'] = $pr;

print_r($res['yes']);

php概率的更多相关文章

  1. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  2. sqlserver中根据表中的配置概率取到数据

      create proc pr_zhanglei_test1 /*功能描述: 根据t_zhanglei_test1中perc设置的概率,取到相应数据old_id */ as declare @per ...

  3. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  4. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  5. UVA1637Double Patience(概率 + 记忆化搜索)

    训练指南P327 题意:36张牌分成9堆, 每堆4张牌.每次拿走某两堆顶部的牌,但需要点数相同.如果出现多种拿法则等概率的随机拿. 如果最后拿完所有的牌则游戏成功,求成功的概率. 开个9维数组表示每一 ...

  6. caffe机器学习自带图片分类器classify.py实现输出预测结果的概率及caffe的web_demo例子运行实例

    caffe机器学习环境搭建及python接口编译参见我的上一篇博客:机器学习caffe环境搭建--redhat7.1和caffe的python接口编译 1.运行caffe图片分类器python接口 还 ...

  7. 【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

    其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 #include <iostream> #include <cstdio> #include ...

  8. 【BZOJ3036】绿豆蛙的归宿 概率与期望

    最水的概率期望,推荐算法合集之<浅析竞赛中一类数学期望问题的解决方法> #include <iostream> #include <cstdio> using na ...

  9. IT人生知识分享:概率与运气

    前言: 最近的人生多了些体验,也读了些许书,感觉还是有些知识是可以分享的. 今天难得周六,特意开电脑了,花几个小时写写,和大伙分享分享点知识. 以下内容,更多的需要读者思考,所以结论不会写太清晰,但一 ...

  10. UVA11021 Tribles[离散概率 DP]

    UVA - 11021 Tribles GRAVITATION, n. “The tendency of all bodies to approach one another with a stren ...

随机推荐

  1. Codeforces Round #615 (Div. 3) A-F简要题解

    contest链接:https://codeforces.com/contest/1294 A. 给出a.b.c三个数,从n中分配给a.b.c,问能否使得a = b = c.计算a,b,c三个数的差值 ...

  2. 大数据-SparkStreaming

    SparkStreaming SparkStreaming是一种微批处理,准实时的流式框架.数据来源包括:Kafka, Flume,TCP sockets,Twitter,ZeroMQ等 SparkS ...

  3. 关于layui的日期和时间组件laydate闪屏的坑

    https://blog.csdn.net/liangwenli_/article/details/82786713 jsp页面: <input type="text" cl ...

  4. 第四十四篇 入门机器学习——matplotlib基础——实现数据可视化

    No.1. 绘制一条正弦曲线 No.2. 在一张图中绘制多条曲线 No.3. 可以为曲线指定颜色.线条样式 No.4. 可以指定横纵坐标轴的范围 也可以使用: No.6. 可以为每条曲线添加图示 No ...

  5. Solr与JDK对应版本关系,Tomcat与JDK版本对应关系

    最新在部署solrCloud集群,由于自己机器上用的JDK都是JDK1.7的,然后我就从网上下载了最新下载了最先的solr6.6.0和最新的Tomcat9.0,部署了一下,开始报错,提示solr和JD ...

  6. js解释器

    又名js引擎 JavaScript是解释型语言,这就是说它无需编译,直接由JavaScript引擎直接执行. 既然说到了解释型语言,那么我们就来分别以下解释型语言和编译型语言的差别: 编译型语言:程序 ...

  7. C语言究竟是一门怎样的语言?

    对于大部分程序员,C语言是学习编程的第一门语言,很少有不了解C的程序员. C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在 ...

  8. 【做题笔记】洛谷P1464 Function

    我先谔谔一波 /kk 我谔谔 看题第一眼:欸这不就是按题意递归嘛,,直接搞不就好了 3 min 后,重新看题 然后自己手玩了几个样例,噢,递归太多了,铁定会 T 啊...... 然后,作为一个从没写过 ...

  9. STA 开篇

    时序分析=动态时序分析+静态时序分析 动态时序分析简单讲就是gate-level simulation,仿真对象是netlist+sdf,通过SDF反标,得到gate跟net的delay,通过输入大量 ...

  10. 百炼OJ - 1003 - Hangover

    题目链接 思路 求一个数列的前n项和(1/2, 1/3, ...., 1/n)大于所给数所需的项数. #include<stdio.h> int main() { float a; whi ...