有两种方法可以做到这一点,我可以从头脑中想到:
选项1:使用数据集中的键值填充新数组,其中权重确定项目重复的频率.然后,此数组中的比例与加权分布匹配.只需抓住使用$arr[array_rand($arr)].虽然简单易懂,但如果有很多物品,或者重量值非常高,这会在你的脸上爆炸.
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
Run Code Online (Sandbox Code Playgroud)
选项2.对权重求和.选择0和权重之和的随机数.循环遍历数据集中的元素,与您选择的随机数进行比较.只要你点击一个等于或大于随机索引的那个,就选择那个元素.
function findRandomWeighted(array $input) {
$weight = 0;
// I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter.
foreach($items as $item) {
$weight += $item['weight'];
}
$index = rand(1, $weight);
foreach($items as $item) {
$index -= $item['weight'];
if($index <= 0) { return $item['value'] }
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
在下面的评论中我们的对话之后,这里是一个包含代码的Pastebin: