zoukankan      html  css  js  c++  java
  • php编写抽奖后台实现抽奖概率计算

    下面提供两种抽奖中奖率计算的算法 ,第一种是自己设计出来的 ,第二种是比较经典的。 最重要的一点 概率学: 基数越大越能体现出中奖率。  比如扔10次硬币 5次正面和5次反面的概率比较小, 但是扔100次 1000次 10000次时 得到50%正50%反的结果越来越明显

    方法一:

     1         //奖品的集合列表
     2             $prize_list = [
     3                 [
     4                     "id" => 1,          //奖品的唯一标示
     5                     "name" => "奖品名称1",  //奖品的名称
     6                     "img" => "upload/imgs/1578904174tR4llI.png",   //奖品的图片
     7                     "pro" => 5,         //奖品中奖的基数   这里的基数必须为正整数
     8                     "num" => 0,         //奖品允许抽中的次数  0表示不限制
     9                 ],
    10                 [
    11                     "id" => 2,
    12                     "name" => "奖品名称2",
    13                     "img" => "upload/imgs/1578968755ie9uow.png",
    14                     "pro" => 5,
    15                     "num" => 0,
    16                 ]
    17             ];
    18             //计算奖品的概率问题(方法一) 假设我们所有奖品的中奖率设定为百分比,最小的中奖率是1%最大中奖率是100%
    19             $arr = [];  //根据奖品的中奖率生成一个中奖集合,集合越大,中奖率越准确
    20             foreach ( $prize_list as $key => $vo ){
    21                 //如果中奖率小于1  将不会加入到中奖集合中(永远都不会被抽中)
    22                 if( $vo >= 1 ){
    23                     for( $i = 1 ; $i <= $vo['pro'] ; $i++ ){ //循环奖品设置的中奖率 ,
    24                         array_push( $arr ,$vo['id'] ); // 循环将奖品的id添加到中奖的集合中(如果商品A的中奖率为20,那么商品A的id就会咋中奖集合中重复20次)
    25                     }
    26                 }
    27             }
    28             //随机打算数组内中奖id的顺序
    29             shuffle( $arr );
    30             $lucky_index = array_rand( $arr , 1 );  //随机从中奖的集合中获取一个中奖的元素(这里返回的是当前元素所在的索引)
    31             $lucky_id = $arr[$lucky_index];    //这里最终确定了抽中的奖品id
    32             return $lucky_id;

    方法二:

     1         //奖品的集合列表
     2             $prize_list = [
     3                 [
     4                     "id" => 1,          //奖品的唯一标示
     5                     "name" => "奖品名称1",  //奖品的名称
     6                     "img" => "upload/imgs/1578904174tR4llI.png",   //奖品的图片
     7                     "pro" => 5,         //奖品中奖的基数   这里的基数必须为正整数
     8                     "num" => 0,         //奖品允许抽中的次数  0表示不限制
     9                 ],
    10                 [
    11                     "id" => 2,
    12                     "name" => "奖品名称2",
    13                     "img" => "upload/imgs/1578968755ie9uow.png",
    14                     "pro" => 5,
    15                     "num" => 0,
    16                 ]
    17             ];
    18             $arr_pro = [];   //抽奖的集合 最总的结果在次数组的产生
    19             foreach ( $prize_list as $key => $vo ){
    20                 $arr_pro[$vo['id']] = $vo['pro'];
    21             }
    22             //计算概率数组的总基数(基数越大 中奖率越准确)
    23             $arr_num = array_sum( $arr_pro );   //将所有的中奖率累加起来得到一个基数
    24             $lucky_id = '';
    25             //概率数组循环27             foreach ($arr_pro as $key => $vv) {
    28                 $randNum = mt_rand(1, $arr_num);
    29                 if ($randNum <= $vv) {
    30                     $lucky_id = $key;
    31                     break;
    32                 } else {
    33                     $arr_num -= $vv;
    34                 }36             }
    37             unset($arr_pro);
    38             return $lucky_id;

    这里给大家提供一个开发抽奖系统的思路问题的文章:https://www.cnblogs.com/hinq/articles/12195497.html

      

  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/hinq/p/12195904.html
Copyright © 2011-2022 走看看