php赋值权重_PHP实现权重算法

用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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值