php - PHP:加权概率函数,返回不正确的结果
问题描述
我有 2 个数组,一个是奖品数组,另一个是获奖百分比/权重数组。
Prize Array: Prize 1, Prize 2, Prize 3, Prize 4, Prize 5
Prize Winning Percentage/Weights Array: 5, 5, 5, 70, 15
IE
- 一等奖有5%的中奖机会
- 二等奖有5%的中奖机会
- 三等奖有5%的中奖机会
- 奖品 4 有 70% 的中奖机会
- 奖品 5 有 15% 的获胜机会。
以下是我的函数,我用它来根据获胜百分比/重量计算获胜奖金。
<?php
$values = array(1, 2, 3, 4, 5);
$weights = array(5, 5, 5, 70, 15);
$res = weighted_random($values, $weights);
echo $res; die;
function weighted_random($values, $weights){
$count = count($values);
$i = 0;
$n = 0;
if (array_sum($weights) <= 0 ) { return $values[$i] . ' - ' . $weights[$i]; }
$num = mt_rand(1, array_sum($weights));
while($i < $count){
$n += $weights[$i];
if($n >= $num){
break;
}
$i++;
}
return "Number: " . $num . " Value: " . $values[$i] . ' Weight: ' . $weights[$i];
}
?>
现在,这个功能已经运行了 40 次,其中 4 次中奖了 2。如果你计算,那么 40 的 5% 是 2。所以 2 奖本应赢得 2 次,但事实并非如此。
功能有问题吗?或者我错过了什么?
长期以来,我一直在努力寻找解决方案。请帮忙。
解决方案
推荐阅读
- python - 关于训练/验证损失方面的模型比较
- r - 使用 R 中的 2 个条件匹配表
- javascript - 进入功能时取消角度8中的promise api请求
- java - 树dfs算法的空间复杂度
- asp.net-core - 如何最好地处理 FluentValidation 所需的数据获取
- sql - 在 SQL 中使用连接列创建视图 > 然后使用 Case 语句影响值
- flutter - 如何在flutter上使用信用卡Visa和Mastercard进行支付?
- kubernetes - 如何为自定义 Helm 3 图表选择依赖版本名称
- javascript - Firestore 没有执行操作的权限
- angular - 关于
在角