您的位置:首页 > 其它

1000个人抽奖 1等级2人 2等级4人 三等奖10人

2017-04-19 17:49 253 查看
<?php
//面试被问到的一个题目:1000个人抽奖 1等奖2人 2等奖4人 三等奖10人

//思路 循环1000个人的数组
//每个人从奖券池中取一个数,如果这个数在 1,2,3,则代表中奖,取出后从奖券池中删除该奖券

$allNums = 1000; //总人数
$configs = [
'1' => ['nums' => 2, 'owns' => []],
'2' => ['nums' => 4, 'owns' => []],
'3' => ['nums' => 10, 'owns' => []],
];
$allPages = []; //全部奖券
foreach ($configs as $k => $v) {
$arr[$k] = $v['nums'];
for($i = 0; $i< $v['nums']; $i++){ //向奖券池里面填充2个1等奖 4个2等奖 10个三等奖
array_push($allPages, $k);
}
}
$left = $allNums - array_sum($arr);
for($i = 0; $i< $left; $i++){
array_push($allPages, 0); //填充其他奖
}

shuffle($allPages); //打乱数组
$wins = []; //获奖者数组
for($i=0; $i< $allNums; $i++){
$index = array_rand($allPages); //随机抽一张奖券 array_rand获取键
$page = $allPages[$index]; //通过键 获取值
if(in_array($page, [1, 2, 3])){ //如果中奖
$configs[$page]['owns'][] = $i;
$wins[] = $i;
//$wins[] = $random;

}
unset($allPages[$index]); //不管是否中奖 删除该奖券
shuffle($allPages); //重新打乱奖券
if(count($wins) >= 16){ //如果已经诞生了16个得奖者 结束循环
//echo '循环'.$i.'次';
break;
}
}
echo '<pre>';
print_r($configs);
echo '</pre>';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐