php实现根据概率配置随机抽奖

这是我写的一个比较简单的抽奖算法,并没有很严谨,用于我自己写的wap文字游戏(美味小镇)上的随机食材,可以设定概率值

<?php

/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 2017/12/9 0009
 * Time: 14:50
 */
class Rand
{
    public $arr,$not_id,$if_repeat,$odds;
    public function __construct($arr,$if_repeat=1)
    {
        $this->arr=$arr;
        $this->if_repeat=$if_repeat;
        $this->get_odds_array();
    }
    function action($num=1)
    {
        if(!$this->arr||!$this->odds){
            return false;
        }
        $ids = array();
        for ($i = 0; $i < $num; $i++) {
            $res = $this->get_rand($this->arr, $this->odds);
            if ($this->if_repeat == 0) {
                if(count($this->arr)<=count($ids)){
                    return $ids;
                }
                if (in_array($res, $ids)) {
                    $i--;
                } else {
                    $ids[] = $res;
                }
            } else {
                $ids[] = $res;
            }
        }
        return $ids;
    }
    public function get_odds_array($arr=array())
    {
        $arr||$arr = $this->arr;
        foreach ($arr as $k => $va) {
            if(empty($va['odds'])){
                $va['odds']=100;
            }
            $odds[$k] = $va['odds'];
        }
        $this->odds = array_sum($odds);
        return $this;
    }

    public function add_arr($arr=array()){
        $this->arr = array_merge($this->arr,$arr);
        return $this;
    }

    function remove_id($arr=array(),$not_id=array()){
        $arr||$arr = $this->arr;
        $not_id||$not_id = $this->not_id;
        if(empty($not_id)){
            $this->arr = $arr;
            return $this;
        }
        foreach($arr as$k=> $va){
            foreach($not_id as $vo){
                if($k==$vo){
                    unset($arr[$k]);
                }
            }
        }
        $this->arr = $arr;
        return $this;
    }

//返回概率
    function get_rand($arr=array(), $odds=0)
    {
        $arr||$arr = $this->arr;
        $odds||$odds = $this->odds;
        //概率数组循环
        $randNum = mt_rand(1, $odds);
        $odd_num = 0;
        foreach ($arr as $key => $va) {
            if ($randNum > $odd_num && $randNum <= $va['odds'] + $odd_num) {
                return $arr[$key];
                break;
            } else {
                $odd_num += $va['odds'];
            }
        }
        unset ($proArr);
    }

}

$arr=array(
    array(
       'id'=>1,
       'odds'=>100//相对概率值
    ),
    array(
       'id'=>2,
       'odds'=>10//相对概率值
    ),
    array(
       'id'=>3,
       'odds'=>200//相对概率值
    ),
)

调用方法 
$a = new Rand($arr);
$a->action(1);

仙士可博客
请先登录后发表评论
  • 最新评论
  • 总共1条评论
仙士可博客

诗和远方的田野@:小仙快点更新小镇啊!!!!!!!

2019-11-20 17:45:14 回复

  • 本站由白俊遥博客程序搭建
    © 2017-1-17 php20.cn 版权所有 ICP证:闽ICP备17001387号
  • 联系邮箱:1067197739@qq.com