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>';
//面试被问到的一个题目: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>';
相关文章推荐
- 80后的10个人底线
- 个人博客10
- 基于fedora16的nagios环境搭建--个人日记(10)--cacti和nagios整合
- 第六届蓝桥杯大赛个人赛(软件类)校内选拔题目\Java大学B组\3题 x的x次幂等于10
- 有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1、2、3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置。其实就是约瑟夫环问题
- 面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
- #读文笔记#马化腾:用户体验的10/100/1000法则
- 编号1-10的人坐在一起围成一个圈 可以数数从1开始数 数3出列 下个人继续开始从1开始数
- React Native商城项目实战10 - 个人中心中间内容设置
- Timus - 1209 - 1, 10, 100, 1000...
- 如何设计最佳用户体验?腾讯靠10/100/1000法则
- 个人工作总结10
- 站立会议个人博客10(2016/4/28)
- 分支-10. 计算个人所得税(10)
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次通过山洞的人名
- 商业研究(20):滴滴出行,进军海外包车?与OTA携程和包车创业公司,共演“三国杀”?看看分析师、投资人和权威人士等10个人的观点碰撞
- 2017中国大学生程序设计竞赛 - 女生专场 个人训练总结【(7+1)/10】
- C语言学习10:结构体,结构体应用,联合用法,枚举,fopen函数使用,fseek,ftell的作用和文件结束符EOF,数组和文件交换数据,个人信息管理。
- 团队冲刺(二)个人工作总结10
- 1, 10, 100, 1000...