博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 抽奖概率算法
阅读量:5742 次
发布时间:2019-06-18

本文共 1745 字,大约阅读时间需要 5 分钟。

lottery.php

<?php//转自https://segmentfault.com/a/1190000007431893/*  * 不同概率的抽奖原理就是把0到*(比重总数)的区间分块 * 分块的依据是物品占整个的比重,再根据随机数种子来产生0-* 中的某个数 * 判断这个数是落在哪个区间上,区间对应的就是抽到的那个物品。 * 随机数理论上是概率均等的,那么相应的区间所含数的多少就体现了抽奖物品概率的不同。 */function get_rand($proArr){    $result = array();    foreach ($proArr as $key => $val) {        $arr[$key] = $val['v'];    }    $proSum = array_sum($arr);      // 计算总权重    $randNum = mt_rand(1, $proSum);    $d1 = 0;    $d2 = 0;    for ($i=0; $i < count($arr); $i++) {        $d2 += $arr[$i];        if ($i==0) {            $d1 = 0;        } else {            $d1 += $arr[$i-1];        }        if ($randNum >= $d1 && $randNum <= $d2) {            $result = $proArr[$i];        }    }    unset($arr);    return $result;} /* * 使用较多的为这个方法 */function get_rand1($proArr){    $result = array();    foreach ($proArr as $key => $val) {        $arr[$key] = $val['v'];    }    // 概率数组的总概率    $proSum = array_sum($arr);    asort($arr);    // 概率数组循环    foreach ($arr as $k => $v) {        $randNum = mt_rand(1, $proSum);        if ($randNum <= $v) {            $result = $proArr[$k];            break;        } else {            $proSum -= $v;        }    }    return $result;}/* * 奖项数组  * 奖品id,名称,比重  */$arr = array(    array('id'=>1,'name'=>'特等奖','v'=>1),    array('id'=>2,'name'=>'一等奖','v'=>5),    array('id'=>3,'name'=>'二等奖','v'=>10),    array('id'=>4,'name'=>'三等奖','v'=>12),    array('id'=>5,'name'=>'四等奖','v'=>22),    array('id'=>6,'name'=>'没中奖','v'=>50));//测试结果(10000次):get_rand()://count_1:0 count_2:490 count_3:1021 count_4:1172 count_5:2172 count_6:5145//特等奖中奖率全为:0get_rand1()://count_1:92 count_2:477 count_3:1017 count_4:1195 count_5:2264 count_6:4955//总体感觉 get_rand1() 更准确些......

转载于:https://www.cnblogs.com/lovellll/p/10203035.html

你可能感兴趣的文章
RedHat 6 安装配置Apache 2.2
查看>>
Openstack 安装部署指南翻译系列 之 Manila服务安装(Share Storage)
查看>>
underscore.js学习笔记
查看>>
windows下常用命令
查看>>
1.5编程基础之循环控制_29:数字反转
查看>>
组策略 之 设备安装设置
查看>>
人工智能还能干这些?这8种AI应用你可能意想不到
查看>>
实现Hyper-V 虚拟机在不同架构的处理器间迁移
查看>>
简单使用saltstack
查看>>
针对web服务器容灾自动切换方案
查看>>
突破媒体转码效率壁垒 阿里云首推倍速转码
查看>>
容器存储中那些潜在的挑战和机遇
查看>>
R语言的三种聚类方法
查看>>
55%受访企业将物联网战略视为有效竞争手段
查看>>
深入理解Python中的ThreadLocal变量(上)
查看>>
如果一切即服务,为什么需要数据中心?
查看>>
《游戏开发物理学(第2版)》一导读
查看>>
Erlang简史(翻译)
查看>>
深入实践Spring Boot2.4.2 节点和关系实体建模
查看>>
信息可视化的经典案例:伦敦地铁线路图
查看>>