随机函数用处大,随机安排考生座位
下图左表是12名考生,现将其随机安排在6行2列的考试座位中,结果如右表所示。如果让你来做,你会怎么做?
1.一步到位,多单元格数组公式
=INDEX(B3:B14,RIGHT(SMALL(RANDBETWEEN(A3:A14^0,999)/1%+A3:A14,ROW(1:6)*2-{1,0}),2))
RANDBETWEEN(A3:A14^0,999)/1%+A3:A14这部分用上面得到的12个随机数乘以100,再加上1~12的序列号。这样就得到加权处理后的一个新数组。这个新数组中每个元素后2位的序号分别是1~12。
SMALL(RANDBETWEEN(A3:A14^0,999)/1%+A3:A14,ROW(1:6)*2-{1,0})这部分用small函数从加权后的数组中分别提取第1,2,3,···,12个最小值。也就是将加权后的数组从小到大排序。这一步的目的是将每个元素后2位的序号顺序打乱。
然后用right从上一步的结果中截取出右边的2位,得到了打乱顺序的1~12的序号。最后用index返回B3:B14这个区域中对应的姓名。
因为随机函数是易失性函数,结果会变化,所以不好截图说明。下面选取其中1组随机数来进行简单演示和说明。
①是由randbetween产生的介于1~999的12个随机数;②是由①的结果乘以100,再加上1~12的序号得到的,可以看到每个数字的后2位分别是1~12;③是row函数产生的6行2列的二维数组。
④是用small函数从②中分别提取第1,2;3,4;···,12个最小值得到的,也就是②和③共同得到④,可以看到每个数字的后2位不是1~12的顺序了,已经被重排了。⑤是用right从④中截取右边2位数得到的。这样就得到了随机排列的1~12的序号。
2.辅助列法,公式简单
=OFFSET($B$2,RANK(G3,$G$3:$H$8),)
rand生成的随机数基本上是不会重复的,然后用rank计算每个随机数在全部12个随机数中的排名,返回的结果肯定是1~12中的一个数,并且这12个结果也不会重复。也就是无论怎么变化,都是1~12这12个数,只不过顺序和位置不同。
玩过数独的小伙伴都知道,每个九宫格里只能是1~9这9个数。
如果你不理解,可以把rank那部分提出来,单独查看结果。最后以B2单元格为起点,用offset偏移对应的行数,返回对应的姓名。
https://pan.baidu.com/s/1LwNxa8_19Cb6Ar_RylNvzg