为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2018-06-29 15:15:08
以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。于是在面试时间就没有解决这个问题,直到面试结束自己安静下来,仔细想想,发现思路错了。我认为正确的思路是:每个人先得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;


查看完整回答
反对 回复 2018-07-14
?
阿波罗的战车

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));

运行结果:

https://img1.sycdn.imooc.com//5b49c03a0001dd6f03860780.jpg

查看完整回答
反对 回复 2018-07-14
  • 2 回答
  • 0 关注
  • 346 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信