面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?

以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。

于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。

于是在面试时间就没有解决这个问题,直到面试结束自己安静下来,仔细想想,发现思路错了。

我认为正确的思路是:每个人先得6块钱,这样剩下40块钱,之后每次拿出一块钱,随机分配给一个人,如果某个人的钱数达到了上限,那么这个人下次就没有了再得到钱的资格了。这样直到剩下钱都分配完。

当然在接口的实际处理上可以做些优化,例如剩下的钱每次随机分配的钱可以是随机的(当然这个随机要做一些限制,以免一下就分配超额了),然后如果某个人钱+这次随机分配的钱>每个人的上限,那么他就没有资格得到这个钱了。

随机分配也好实现,先算有几个人有资格得到这笔钱,随即一个数,决定给第几个符合资格的人。

我的思路就是这样,大家如果有更好的思路,请告知。谢谢。


长风秋雁
浏览 347回答 2
2回答

慕标琳琳

$cash&nbsp;=&nbsp;40; $user_arr&nbsp;=&nbsp;array(6,6,6,6,6,6,6,6,6,6); while($cash>0){ &nbsp;&nbsp;&nbsp;&nbsp;$user_id&nbsp;=&nbsp;rand(0,&nbsp;9); &nbsp;&nbsp;&nbsp;&nbsp;if($user_arr[$user_id]<12){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user_arr[$user_id]++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cash--; &nbsp;&nbsp;&nbsp;&nbsp;} } ; var_dump($user_arr,array_sum($user_arr));die;性能篇 $arr1=range(2,6); shuffle($arr1); $arr2=range(2,6); shuffle($arr2); $user_arr&nbsp;=&nbsp;array(6,6,6,6,6,6,6,6,6,6);&nbsp; for&nbsp;($i=0;$i<10;$i++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($i<=4){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user_arr[$i]&nbsp;+=&nbsp;$arr1[$i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$j&nbsp;=&nbsp;$i%5; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user_arr[$i]&nbsp;+=&nbsp;$arr2[$j]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;} var_dump($user_arr,array_sum($user_arr));die;

阿波罗的战车

我写了个思路迥异的。。。感觉有点麻烦,不过效率和可扩展性还凑合。思路:每次分配后,都确定剩余的金钱在合理范围。若合理,进行下次分配否则,重新进行此次分配。<?phpfunction&nbsp;hongbao($money,&nbsp;$people,&nbsp;$min,&nbsp;$max){ &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;[];&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($i=0;&nbsp;$i&nbsp;<&nbsp;$people;&nbsp;$i++)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1.进行本次分配 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[$i]&nbsp;=&nbsp;mt_rand($min*100,&nbsp;$max*100)&nbsp;/&nbsp;100;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;2.本次分配后,剩余人数 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$restPeople&nbsp;=&nbsp;$people&nbsp;-&nbsp;($i+1);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;3.本次分配后,剩余金钱 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$restMoney&nbsp;&nbsp;=&nbsp;$money&nbsp;-&nbsp;array_sum(array_slice($result,&nbsp;0,&nbsp;$i+1));&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;4.本次分配后,剩余金钱是否在合理范围?&nbsp;不在则重新分配 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;($restMoney&nbsp;>&nbsp;$restPeople&nbsp;*&nbsp;$max&nbsp;||&nbsp;$restMoney&nbsp;<&nbsp;$restPeople&nbsp;*&nbsp;$min); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result; } $result&nbsp;=&nbsp;hongbao(100,&nbsp;10,&nbsp;6,&nbsp;12); //&nbsp;验证 var_dump($result); var_dump(array_sum($result));运行结果:
打开App,查看更多内容
随时随地看视频慕课网APP