该用户匿名发帖 发表于 2008-6-27 20:21 只看TA 1楼 |
---|
该用户已被删除 |
[求助] 急!急!EXCEL高手请进 我想在EXCEL中从1至50中随机抽出几个数,我用ROUNDUP(50*RAND(),0)函数,可随机抽出的数有重复,而我想要不能重复的数,请各位兄弟姐妹帮忙,看有什么方法实现。先谢了各位。 |
0 |
willam 发表于 2008-6-27 23:24 只看TA 9楼 |
---|
未经验证,但希望对楼主有用,从网上随手google下来的。 ------------------------------------------------------------------------------------- 随机不重复数字序列的生成方法 有些情形下,我们需要生成一个不重复的随机序列。 比如:我们要模拟洗牌,将一副扑克牌去掉大小怪后剩下的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),否则的话,如果当前行等于A1:A52中第C54个值,则: d:INDEX(B$1:B$52,C$54),返回B1:B52中的第C54个值 e:若以上条件都不满足,则返回B1 (5)将C1复制到C1:BA52这个区域里面 (6)在BA1:BA52中,我们就得到了一个不重复的随机序列,按F9可以生成一个新序列。 PS:摘自:http://artin.spaces.live.com/blo ... 2B4C60D%21231.entry |
0 |