微信号:phpgod

介绍:本公众号对PHP开发技术进行全面透析,所含内容适合各个阶段的PHP developer阅读和收藏,既然关注了就一定会有收获.

面试|50w元红包抽奖问题

2017-04-13 23:26 猿哥

若文章排版不清或需要查看文中链接,请点击文章左下角的“阅读原文    


面试问题描述:

  1. 红包总量50W

  2. 参与红包抽奖的人600(人)

  3. 要求每个人的红包在10(RMB)到1000(RMB)之间的闭区间,即包含10也包含100的整数,且保持最大的随机性,不能有剩余


猿哥的解法:


完整代码:

<?php
$amount  = 500000;
$personNumber  = 600;
$min  = 10;
$max  = 1000;
$restMax  $max  $min ;
$restAmount  $amount $personNumber * $min ;
$firstArrangeRedPackageArray  = [];
 
for ( $i =0;  $i < $personNumber $i ++){
     $rand  = mt_rand(0,  $restMax );
     $restAmount  $restAmount  $rand ;
     if ( $restAmount <=0){
         $firstArrangeRedPackageArray [] = 0;
     else  {
         $firstArrangeRedPackageArray [] =  $rand ;
     }
}
if ( $restAmount >0)
{
     rearrangeRestAmount( $firstArrangeRedPackageArray $restAmount $max );
}
//var_export($firstArrangeRedPackageArray);
shuffle( $firstArrangeRedPackageArray );
function  rearrangeRestAmount(& $redPackageArray $restAmount $max  = 1000)
{
     sort( $redPackageArray );
     //从最小的金额开始到最大的金额,依次给用户填充到max=1000
     foreach  ( $redPackageArray  as  $k =>& $redPackage )
     {
         if ( $restAmount  >=  $max  $redPackage )
         {
             $restAmount  $restAmount  - ( $max  $redPackage );
             $redPackage  $max ;
         else  {
             $redPackage  $redPackage  $restAmount ;
         }
     }
}

怎样,是不是很简单,代码没有测试过,但思路很明确,请各位小粉留言提出自己的问题留言,猿哥会选择性回复。


关注微信公众号:PHP技术大全

PHPer升级为大神并不难!


 
PHP技术大全 更多文章 Laravel中使用AdminLTE来编写网站后台 学习php设计模式 php实现门面模式(Facade) PHP android ios相互兼容的AES加密算法 适用于开发者的最佳 Chrome 扩展工具 感悟|编程境界提升
猜您喜欢 最棒的leader,把团队成长放在第一位 《Go语言实战》笔记(一) | Go包管理 移动开发构架漫谈:反劫持实战篇 谈谈敏捷开发和管理 高效 MacBook 工作环境配置