亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

面試問題:發一個隨機紅包,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 關注
  • 1196 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號