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

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

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

森栏 2018-07-31 16:33:08
以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。于是在面试时间就没有解决这个问题,直到面试结束自己安静下来,仔细想想,发现思路错了。我认为正确的思路是:每个人先得6块钱,这样剩下40块钱,之后每次拿出一块钱,随机分配给一个人,如果某个人的钱数达到了上限,那么这个人下次就没有了再得到钱的资格了。这样直到剩下钱都分配完。当然在接口的实际处理上可以做些优化,例如剩下的钱每次随机分配的钱可以是随机的(当然这个随机要做一些限制,以免一下就分配超额了),然后如果某个人钱+这次随机分配的钱>每个人的上限,那么他就没有资格得到这个钱了。随机分配也好实现,先算有几个人有资格得到这笔钱,随即一个数,决定给第几个符合资格的人。我的思路就是这样,大家如果有更好的思路,请告知。谢谢。
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

function microtime_float(){

    list($usec, $sec) = explode(" ", microtime());

    return ((float)$usec + (float)$sec);

}


function getRandParcent(){

    return rand(1,10)/rand(10,100);  

}



function randUserMoney($cash,$min=6,$max=12){

    $cash_ini = $cash;

    $user_arr = array($min,$min,$min,$min,$min,$min,$min,$min,$min,$min);

    $start = microtime_float();

    while($cash>0){

        $user_id = rand(0, 9);

        $rand_point = getRandParcent();

        if($user_arr[$user_id]<$max){

            $ing = microtime_float();

            if($ing-$start>0.01){

                return randUserMoney($cash_ini);

            }

            $rand_money = round($rand_point*$cash,2);

            $user_money = $user_arr[$user_id]+$rand_money ;

            if($user_money<$max){

                $user_arr[$user_id] = $user_money;

                $cash = $cash - $rand_money;

            }

        }

    }

    return [

    'user_money'=>$user_arr,

    'total_money'=>array_sum($user_arr),

    'excute_time'=>$ing-$start

    ];

}


var_dump(randUserMoney(40));


array (size=3)

  'user_money' => 

    array (size=10)

      0 => float 11.59

      1 => float 9.07

      2 => float 11.99

      3 => float 12

      4 => float 9.14

      5 => float 11.6

      6 => float 11.86

      7 => float 9.93

      8 => float 6

      9 => float 6.82

  'total_money' => float 100

  'excute_time' => float 0.004000186920166


查看完整回答
反对 回复 2018-08-06
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

$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-08-06
  • 2 回答
  • 0 关注
  • 1153 浏览

添加回答

举报

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