EXCEL随机把1-31个号分给31人

来源:百度知道 编辑:UC知道 时间:2024/05/15 02:27:48
31个人一个一个地来,比方说:第一个人抽到了10,其它人就只能抽到10以外的数了,第二个人抽到了15,其它人只能抽到10和15以外的数字,不能重复的。我知道EXCEL里有个函数RANDBETWEEN(1,31),它是随机的,但是重复。

添加辅助列,用=rand()生成31个随机数,
在另一列用=rank(b1,b1:b31)拖至31行。
出现同一个小数的可能性仅为0.0000000000000000000000000000000000000000000000000000001%

excel里面有内置的rnd()函数,可以用来生成随机数,但是,有些情形下,我们需要生成一个不重复的随机序列。
比如:我们要模拟洗牌,将一副扑克牌去掉大小怪后剩下的52张打乱。
比较笨的方法是在1-52间每生成一个随机数后,检查该随机数是否出现过,如果是第一次出现,就放到序列里,否则重新生成一个随机数作检查。在excel worksheet里面用这种办法,会造成if多层嵌套,不胜其烦,在VBA里面做简单一些,但是效率太差,越到序列的后端,效率越差。
当然也有比较好的办法,在VBA里面,将a(1)-a(52)分别赋予1-52,然后做52次循环,例如,第s次生成一个1-52间的随机数r,将a(s)与a(r)互换,这样的话,就打乱了原有序列,得到一个不重复的随机序列。
在VBA里这个算法是很容易实现的,但是,处于通用性和安全考虑,有的时候我们并不希望用VBA,我们来看看在worksheet里面如何利用内置函数实现这个功能。
1,在A1-A52间填入"=INT(RAND()*52)+1",产生1-52间的随机数,注意这里是有重复的
2,在B1-B52间填入1-52
3,在C54-BB54填入1-52
4,在C1填入"=IF(ROW()=C$54,INDEX(B$1:B$52,INDEX($A$1:$A$52,C$54)),IF(ROW()=INDEX($A$1:$A$52,C$54),INDEX(B$1:B$52,C$54),B1))"。
分项解释:
a:ROW()=C$54,如果当前行等于当前交换所排的序号
b:INDEX(B$1:B$52,INDEX($A$1:$A$52,C$54)),返回在B1到B52中选择A1:A52中的第C54个值
c:IF(ROW()=INDEX($A$1:$A$52,C$54),否则的话,如果当前行等于A