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

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

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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