原文题目:《哪位 Excel 高人揣摩出的也许随机抽奖技能,太绝了!》
年前咱们宣布过一篇文章《我用 Excel 做了一个年会抽奖器,而后老板点了一下……》,此其中的中心是取得不反复随机整数。
取得不反复随机整数的方式有很多,迭代盘算过分鸡肋,VBA 编程不免牛刀杀鸡。
今日,小花就跟各位分享几个实用的函数公式,超赞的那种哦!
1、帮助排名法
RAND 函数的感化是天生 0-1 之间的随机数,因而咱们只要经由过程 RAND 函数天生一组随机数,再将它们停止排名,就有极大几率可能取得一组不反复随机整数。
C 列 —— 帮助列公式:
=RAND()
B2—— 不反复随机整数公式:
=RANK(C2,$C$2:$C$11)
公式阐明:
RAND 函数可能前往 0-1 之间的随机数;
RANK 函数则是前往某个数在一列数字中相对其余数值的巨细排名。
因而,先天生随机数值,再盘算每个数的排名值,便可取得一组随机整数。
PS : 公式按【F9】键会从新盘算,从新盘算便可革新排名组,取得新的不反复随机整数。本文其余案例同理。
此两个函数是咱们取不反复随机数中最多见的一种方式。
它比拟简略,轻易学会。
不过也许公式有个致命 Bug 是,每个 RAND 函数天生的随机数都是独立的,也就是说,此些随机数仍是有极小的几率相互相称,进而呈现反复的排名值。如下图:
RAND 函数帮助法其实不谨严,且须要帮助列,因而只能算是不反复随机整数的入门级解法。
接下来,小花来详细介绍两种比拟谨严的方式,可能比拟难 ,各位重在懂得处理的思绪,干货满满,一定要保持看下去哦!
2、逐次打消法
取得不反复随机整数的中心成绩是:如何让曾经呈现的数字不再呈现?
处理思绪:把呈现的数字从抽取数字池中打消掉,而后再从残余数字中随机取数,此样就可能天生一组不反复随机整数。
底下也许公式就是依照也许思绪设置的。
B3—— 逐次打消法公式:
{=SMALL(IF(COUNTIF($B$1:B2,ROW($1:$10)),"",ROW($1:$10)),RANDBETWEEN(1,12-ROW()))}
PS:该公式内含数组运算,输入公式后需按【Ctrl+Shift+Enter】函数才干准确运算。
公式比拟复杂,各位随着我的思绪,越来越懂得公式的道理。
B3 单元格公式阐明:
① COUNTIF($B$1:B2,ROW($1:$10))
此一步的重要目标是:经由过程 Countif 函数停止数值计数,进而断定以后单元格的上一单元格数值能否有在 1 到 10 中呈现过 。
以后单元格是 B3 ,$B$1:B2 是它后面的单元格。$B$1:B2 仅锁定肇端单元格,表现从首个单元格 B1 到以后单元格的上一单元格,此就涵盖了全体已抽取的整数。
ROW ($1:$10) 前往 1 到 10 的有序数组 {1;2;3;4;5;6;7;8;9;,COUNTIF 函数统计此组数能否在全体已抽取的整数中呈现,如呈现前往 1,不然前往 0。
因为唯一数字 7 呈现在 $B$1:B2 中,B2 单元格今朝是 7 , 因而 COUNTIF 数组运算后前往数组:
{ 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; 10 }
{ 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 }
② IF(①,"",ROW($1:$10))
如下图,将①中成果数组 {0;0;0;0;0;0;1;0;0;0} 做为逻辑断定值,1 等价于 TRUE,0 等价于 FALSE。
IF 函数依据逻辑断定值,TRUE 前往空 "",FALSE 前往对应的数字。
因而全部公式片断②就完成了将有序数组 {1;2;3;4;5;6;7;8;9; 中在 $B$1:B2 已呈现的数字替换为空,完成逐次打消。
将 B2 单元格中的 7 替换为空 "",此样后续随机取数不会抽到后面所呈现的数值。
{ 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; "" ; 8 ; 9 ; 10 }
③ {SMALL(②,RANDBETWEEN(1,12-ROW()))}
此一步的目标重要是随机取数。
SMALL 函数重要用来提取数组中第 k 个最小值的数值,疏忽空值。
RANDBETWEEN 则卖力在指定范围内,随机抽取一个值做为 k。
为确保每个数被抽取的几率分歧且不犯错,k 的最小值(即 Bottom)必需即是 1,最大值(即 TOP)必需一直与②成果数组中的数字个数分歧。
公式中,用 12-ROW() 做为 TOP 的值。ROW () 用于前往以后单元格的行数,在 B2 时,12-ROW () 为 10,逐行递加 1,B3 为 9,恰好一直与②{ 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; "" ; 8 ; 9 ; 10 } 中残余可抽取的数字个数分歧。
RANDBETWEEN 函数在 1 和残余个数 9 之间随机取数 k,再应用 SMALL 函数来取对应第 k 小的数字 m,终极再取得一个不反复随机数,以此类推,便可取得一组不反复随机整数。
掌握了随机不反复整数公式后,只要略加变形,咱们就可能借助 INDEX 函数完成随机抽奖等高端操纵。下图就是应用逐次打消法随机抽取 5 名获奖职员的案例。
D3—— 随机抽奖公式:
{=INDEX($A$2:$A$11,SMALL(IF(COUNTIF($D$1:D2,$A$2:$A$11),"",ROW($1:$10)),RANDBETWEEN(1,12-ROW())))}
3、乱序取余法
如果可能将指定范围内的数字随机打乱,那末只要按打乱后的次序顺次抽取数字就可能取得一组不反复随机数。
底下也许公式就是将有序数组加上 10 的随便倍数来打乱数字的巨细次序,再应用 LARGE 或 SMALL 函数来顺次取值,取余,即终极天生随机不反复整数。
B2:B11 数组公式 —— 乱序取余法:
{=MOD(LARGE(RANDBETWEEN(ROW(1:10)^0,10)*100+ROW(1:10),ROW(1:10)),100)}
PS:该公式为数组公式,其输入成果为一组数,需占用 B2:B11 单元格才干准确显现。
因而,需先抉择 B2:B11 单元格,输入公式后,再按【Ctrl+Shift+Enter】。不可像逐次打消法公式如许在单个单元格里按【Ctrl+Shift+Enter】履行数组运算后再拖动添补,牢记!
底下停止简略的公式说明。
公式阐明:
ROW (1:10)^0 将 1 到 10 的有序数组 A {1;2;3;4;5;6;7;8;9; 取其 0 次幂,取得 10 个 1 组成的常数数组 B {1;1;1;1;1;1;1;1;1;1}。
PS : 在数学中,任何非 0 的 0 次幂,成果都为 1 。
RANDBETWEEN(ROW(1:10)^0,10)
应用 RANDBETWEEN 函数来天生 10 个相互独立的从 1 到 10 的随机整数(可能反复),取得随机数组 C {10;6;3;8;4;2;8;5;4;7}。
数组 C*100+ROW (1:10) 将数组 C 扩展 100 倍再加上有序数组 A,取得 (不反复) 数组 D {1001;602;303;804;405;206;807;508;409;7。
数组 D 的特点是其尾数顺次是有序数组 A {1;2;3;4;5;6;7;8;9;,但其巨细却由位于百位的随机数组随机数组 C {10;6;3;8;4;2;8;5;4;7} 决议,此就完成了将有序数组 A 随机打乱。
{=MOD(LARGE(RANDBETWEEN(ROW(1:10)^0,10)*100+ROW(1:10),ROW(1:10)),100)}
经由过程 LARGE 函数顺次取最大的第 1 到第 10 的数字,再取 100 的余数,就可能将数组 A {1;2;3;4;5;6;7;8;9; 中的每个数字从新剥离出来,
但此时他们的次序曾经按随机数组 C 的巨细停止了重排,取得公式盘算成果数组 E {1;7;4;10;2;8;9;5;3;6},数组运算将成果数组顺次填列在 B2:B11 单元格中。
应用乱序取余法公式,可能轻松处理随机分组成绩。
咱们来简略看看一个基本案例。
如下图,将一组姓名随机分为 2 组。
B2:B11 数组公式 —— 乱序取余法:
{=MOD(MOD(LARGE(RANDBETWEEN(ROW(1:10)^0,10)*100+ROW(1:10),ROW(1:10)),100),2)+1&"组"}
学会此三种方式,不反复随机取值的做法就难不倒各位啦~
4、最后的话
本文小花分享的取得随机不反复整数的三个函数公式,包含:
帮助排名法:
经由过程 RAND 构建帮助列,再应用 RANK 停止排名;
逐次打消法:
应用 IF+COUNTIF 打消已呈现值,在用 SMALL 随机取值;
乱序取余法:
构建随机数组 * 100 + 有序数组,用 LARGE 停止排序后再由 MOD 取余数;
各位学会了吗?此下平常的抽奖和团建随机组队不用愁了吧!
本文来自微信公众号:秋叶 Excel (ID:excel100),作者:小花