假设有四个选项:a 占 10%,b占 20% ,C占 30% , d 占 40% ,原理就是现获取随机数,然后找区间。
当然了,选项的数量可以任意。目前默认是总和是 100% 。如果需要别的数,修改随机数的范围即可。
这个算法,比较简单,效率也还算高。
$data = [
'a' => 10,
'b' => 20,
'c' => 30,
'd' => 40
];
echo randomSelect($data);
function randomSelect(&$array)
{
$datas = $array;
if (!is_array($datas) || count($datas) == 0) {
return false;
}
asort($datas); //按照大小排序
$random = rand(1, 100);
$sum = 0;
$flag = '';
foreach ($datas as $key => $data) {
$sum += $data;
// 看取出来的随机数属于哪个区间
if ($random <= $sum) {
$flag = $key;
break;
}
}
if ($flag == '') { // 如果传递进来的值的和小于100 ,则取概率最大的。
$keys = array_keys($datas);
$flag = $keys[count($keys) - 1];
}
return $flag;
}