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

举报
仙士可 发表于 2023/06/21 16:47:20 2023/06/21
【摘要】 这是我写的一个比较简单的抽奖算法,并没有很严谨,用于我自己写的wap文字游戏(美味小镇)上的随机食材,可以设定概率值<?php/** * Created by PhpStorm. * User: tioncico * Date: 2017/12/9 0009 * Time: 14:50 */class Rand{ public $arr,$not_id,$if_repeat,$odds...

这是我写的一个比较简单的抽奖算法,并没有很严谨,用于我自己写的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); 复制
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。