【动态数组】行业案例:抽奖程序三种
创作者俱乐部成员
困难如山,我有金山。
欢迎收看本期【动态数组】专题,我是学弟。
【动态数组】专题,均使用动态数组的相关函数,进行一定范围内行业应用。
本期学弟带大家进行抽奖程序的模拟制作。
社区ID:清华学弟任泽岩
WPS办公软件商业讲师
- 金山办公最有价值专家(KVP)、金山办公认证讲师(KCT)、金山WPS社区优秀创作者、金山文档行业金鹰社社员、表格菁培班毕业生;
- 微博认证职场博主、微信视频号年度潜力主播、百度百科【任泽岩】词条收录;
- 中国南方航空公司十佳教员、金牌微课制作师,全国培联/培协推优大赛金奖获得者,《培训》杂志“师道匠心”全国金牌内训师称号获得者,两度获得Toastmasters国际演讲会International Speech Contest赛事冠军;
- 中国管理科学学会高级企业培训师,入选全国优秀技能型人才库。
抽奖,大家都非常熟悉,在本案例中,我们假定:
一共有20位员工:赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许
要抽出三等奖3名、二等奖2名、一等奖1名
每个人最多只能中一种奖项
👋 | 抽奖的方式一般有三种:
|
即:
一次把6个获奖者全抽出来;
分三次,每个奖级的获奖者一次性抽出来;
分六次,每个获奖者抽一次。
从WPS表格的角度来讲,这三种方法的抽奖原理很相似,都是给所有人赋予一个唯一的随机值,然后取最大(或最小)的前N个值,作为得奖的随机数,再进行反查,得到获奖者的工号和姓名;三种抽奖方法的工作量有所不同。
接下来学弟由浅入深,分别进行抽奖模拟:
【一次抽6个】
使用RAND()函数赋予一个随机数,这个随机数有9位小数,这样在进行排序的时候很难很难很难遇到完全相同的数字啦。(学弟这里用了RAND()*RAND()双保险,真的只有几亿分之一的概率才能完全相同了。)
使用=XLOOKUP(LARGE(D2:D21,ROW(A1:A6)),D2:D21,B2:B21,,0)
对找到前六大的随机值,通过XLOOKUP反查他们的工号,再通过
=VLOOKUP(G2#,B2:C21,2,0)
找到工号对应的姓名(此举能够避免重名的情况,工号在任何组织里都是每个人唯一的)
按F9刷新,就可以一次性摇出6位获奖者啦!
【一个奖级抽一次】
这种抽法比前一种的难点在于,抽完3个三等奖以后,就要把他们从大数据库里删除,不让他们参加二等奖的抽取,因此:
设置3列随机数,只要三等奖随机数对应的工号与前面源数据表的工号相同,则用0代替。由于FIND不能直接在数组中查找,因此使用TEXTJOIN函数将几个中奖结果用","连起来,然后在里面找工号,比如:
在
,2,9,5,
中查找
,2,
,9,
,5,
这样就能避免"12"中能找到"1"、也能找到"2"的错误情况。
=IFERROR(IF(FIND(","&B2&",",","&TEXTJOIN(",",,$K$2:$K$4)&","),0),RAND()*RAND())
真值强制赋予0,假值继续赋予随机数。由于RAND()函数生成的是0-1之间的随机数,只要被赋予0,那么在二等奖的抽取中,就永远不可能在LARGE前几名,绝对抽不到了。
抽取一等奖也是一样,要把三等、二等奖的工号全连起来,一起赋值查找,因此强制赋予的0是越来越多的,而且会“一0到底”:
这里还有一个需要注意的事情,由于三等奖在抽取过程中本身就是随机数,会一直在动,因此抽完的3位三等奖,需要有一个手工复制-选择性粘贴-值 的过程,进行记录:
【6个人抽6次】
理解了这一点,6个人抽6次就很好理解了,它就是需要做6组随机数:
注意的是每次都要:
进行一次选择性粘贴值,记录中奖人员;
写随机数的公式时,注意每多一个中奖工号,就要多带一个单元格进行查找;
写抽奖的公式时,注意LARGE中的列是要对应不同的列,依次向右。
软件分享链接:
【金山文档】 抽奖程序三种
https://kdocs.cn/l/cd1YtY7RF9Oo
此外,在学弟本文起草过程中,得到WPS社区@懒得批爆 老师的大力帮助,在此深表感谢!
祝大家学习愉快!
如果你觉得今天的教程对你有帮助,欢迎在下方为我点一颗小红心💖💖💖哦!
>>> 欢迎收看清华学弟任泽岩WPS社区【个人帖子合集】 <<<
创作者俱乐部成员
创作者俱乐部成员
WPS函数专家
创作者俱乐部成员
创作者俱乐部成员
创作者俱乐部成员
创作者俱乐部成员