以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。于是在面试时间就没有解决这个问题,直到面试结束自己安静下来,仔细想想,发现思路错了。我认为正确的思路是:每个人先得6块钱,这样剩下40块钱,之后每次拿出一块钱,随机分配给一个人,如果某个人的钱数达到了上限,那么这个人下次就没有了再得到钱的资格了。这样直到剩下钱都分配完。当然在接口的实际处理上可以做些优化,例如剩下的钱每次随机分配的钱可以是随机的(当然这个随机要做一些限制,以免一下就分配超额了),然后如果某个人钱+这次随机分配的钱>每个人的上限,那么他就没有资格得到这个钱了。随机分配也好实现,先算有几个人有资格得到这笔钱,随即一个数,决定给第几个符合资格的人。我的思路就是这样,大家如果有更好的思路,请告知。谢谢。
2 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
$cash = 40; $user_arr = array(6,6,6,6,6,6,6,6,6,6); while($cash>0){ $user_id = rand(0, 9); if($user_arr[$user_id]<12){ $user_arr[$user_id]++; $cash--; } } ; var_dump($user_arr,array_sum($user_arr));die;
性能篇 $arr1=range(2,6); shuffle($arr1); $arr2=range(2,6); shuffle($arr2); $user_arr = array(6,6,6,6,6,6,6,6,6,6); for ($i=0;$i<10;$i++){ if($i<=4){ $user_arr[$i] += $arr1[$i]; }else{ $j = $i%5; $user_arr[$i] += $arr2[$j]; } } var_dump($user_arr,array_sum($user_arr));die;
阿波罗的战车
TA贡献1862条经验 获得超6个赞
我写了个思路迥异的。。。感觉有点麻烦,不过效率和可扩展性还凑合。
思路:每次分配后,都确定剩余的金钱在合理范围。
若合理,进行下次分配
否则,重新进行此次分配。
<?phpfunction hongbao($money, $people, $min, $max){ $result = []; for ($i=0; $i < $people; $i++) { do { // 1.进行本次分配 $result[$i] = mt_rand($min*100, $max*100) / 100; // 2.本次分配后,剩余人数 $restPeople = $people - ($i+1); // 3.本次分配后,剩余金钱 $restMoney = $money - array_sum(array_slice($result, 0, $i+1)); // 4.本次分配后,剩余金钱是否在合理范围? 不在则重新分配 } while ($restMoney > $restPeople * $max || $restMoney < $restPeople * $min); } return $result; } $result = hongbao(100, 10, 6, 12); // 验证 var_dump($result); var_dump(array_sum($result));
运行结果:
- 2 回答
- 0 关注
- 346 浏览
添加回答
举报
0/150
提交
取消