用PHP实现一个权重算法非常简单,我们只需要理清我们的思路即可:假设我们要给三个小朋友分糖果,A分的糖果的权重是5,B是3,C是2,如何设计一个算法实现?
大概思路就是,我们把三者的权重求和,然后随机一个1-这个数的值,以上题为例,所以我们应该随机一个1-10的数,我们假设1-5的属于A,6-8属于B,9-10属于C。
所以程序就应该是这样:$weights = [2 , 5 , 7];
$range = array_sum($weights);
$needle = 0;
$start = 1;
$rand = mt_rand($start, $range);
foreach ($weights as $weight) {
if ($rand <= ($weight + $start - 1)) break;
$start = $start + $weight;
$needle++;
}
var_dump($needle);
起初,我是有把$weights给排序一次的,但是后来又想明白了,其实这里不管是否排序,都可以正常执行。可以拿一个简单的例子来说明,假设我们现在有两个权重,一个是1,一个是10,如果排序来讲,只有随机到1的时候,才能分配给权重1的,如果倒过来,10在前面,也就是说只有随机到11才能分配。无论是1还是11,终究只有一次分配的机会。
所以,其实这里分配与是否排序无关,因为他最终是根据你权重的大小来在指定区域内划出一个属于他自己的范围,如果在这个范围,就属于他。
来源:https://hellonine.top/index.php/archives/67/