【PHP】解析权值算法 随机概率
反射的棱镜 Lv1

【PHP】解析权值算法

某次需要用到时候顺便百度了 感觉很好玩 从头到尾分析下 计算概率十分有用 :D

稍微优化了下的代码 先拿出个例子 :D

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$list = ['a'=>12,'b'=>45,'c'=>67];
$sum = 0;
$listPoint = [0];

foreach ($list as $key => $value){
$sum += $value;
array_push($listPoint,$sum);
}

$num = rand(0,$sum);

for($i=0; $i<count($listPoint)-1; $i++){
if($num>=$listPoint[$i]&&$num<=$listPoint[$i+1]){
$elem = array_slice($list,$i,1);
var_dump($elem);
}
}

先从头往下慢慢看 $list 分别定义了三个键值对 a b c 后面的值分别对应被选中的概率 分别占多少
覆盖

定义一个变量 $sum = 0 为了存储之后的和 然后定义一个空数组 填充一个0下标 $list

先来看下这个for each 遍历了下list数组 分别拿到键值对

第一次遍历拿到 $key a 和 $value 12 这时候 $sum = 0+12 = 12

1
2
3
4
foreach ($list as $key => $value){
$sum += $value; //第三次循环 现在sum=12+45+67 = 124 所以最后要从0-124中随机
array_push($listPoint,$sum); //插入到$listPoint数组里 因为0已经被填充所以开始下标为1
}

目前var dump结果为

1
2
3
4
5
6
7
8
9
10
11
array(4) {
[0]=>
int(0)

[1]=>
int(12)
[2]=>
int(57)
[3]=>
int(124)
}

接下来到随机数了

1
$num = rand(0,$sum); // $sum = 124 假如从0 - 124 随机到了 42   num = 42

开始循环 循环的次数 = 数组数量

1
for($i=0; $i<count($listPoint)-1; $i++) // count($listPoint) count获取数组元素数量 数组里加上0填充 一共4个数组 所以要减去1 为数组数量3 

接下来判断 第一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 源码
if( $num >= $listPoint[$i] && $num <= $listPoint[$i+1] ){
$elem = array_slice($list,$i,1);
var_dump($elem);
}

// 第一次循环 $num=42 $listpoint=12 因为下标是0所以为a=12 1下标是b=45
// 42>=12 与 42<= 45 条件等于 则执行下列内容
if( 42 >= $listPoint[0] && 42 <= $listPoint[0+1] ){
// array_slice 第一参数取的列表 第二参数规定从哪个元素开始 第三参数规定取几个元素
$elem = array_slice($list,0,1);
// 输出 所以取到的是a 因为a满足2个条件
var_dump($elem);
}

// 正常到这里就停止了 来模拟下不符合条件
// 第二次循环 $num=42 $listpoint=45 因为下标是1所以为b=45 2下标是c=67
// 42>=45 与 42<= 67 第一个条件不符合 结束
if( 42 >= $listPoint[0] && 42 <= $listPoint[0+1] ){
// array_slice 第一参数取的列表 第二参数规定从哪个元素开始 第三参数规定取几个元素
$elem = array_slice($list,0,1);
// 输出 所以取到的是a 因为a满足2个条件
var_dump($elem);
}
  • 本文标题:【PHP】解析权值算法 随机概率
  • 本文作者:反射的棱镜
  • 创建时间:2022-06-06 19:30:50
  • 本文链接:https://maid.ink/2022/06/06/【PHP】解析权值算法/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!