Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1859|回复: 9

[已解决]请问老师,M个数字中随机抽取N个怎么弄?

[复制链接]
发表于 2017-8-31 15:45 | 显示全部楼层 |阅读模式
捕获.JPG
A1、B1都是5个数字,不重复。我要从A1中随机抽取4个数字,B1中随机抽取1个数字,组合起来放在A2,怎么弄?VBA或者公式都可以。

A1、B1数据是举例说明,不一定完全相同。谢谢老师!
最佳答案
2017-8-31 16:45
VBA随机取数乱序输出。
  1. Sub aaa()
  2. Dim s1$, s2$, s$, arr(1 To 5), i&, n&
  3. s1 = "76532": s2 = "98410"
  4. s1 = Replace(s1, Mid(s1, Int(Rnd * 5) + 1, 1), "")
  5. s = s1 & Mid(s2, Int(Rnd * 5) + 1, 1)
  6. Do While i < 5
  7.   n = Int(Rnd() * 5) + 1
  8.   If arr(n) = "" Then
  9.     i = i + 1
  10.     arr(n) = Mid(s, i, 1)
  11.   End If
  12. Loop
  13. MsgBox Join(arr, "")
  14. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-8-31 16:25 | 显示全部楼层
不考虑顺序随机,公式=--SUBSTITUTE(A1,MID(A1,INT(RAND()*5)+1,1),"")&MID(B1,INT(RAND()*5)+1,1)。
说明:加--的原因是,不加的话单元格格式一直会变成文本格式,就只显示公式内容啦,不知道其他电脑是否一样。
回复

使用道具 举报

发表于 2017-8-31 16:45 | 显示全部楼层    本楼为最佳答案   
VBA随机取数乱序输出。
  1. Sub aaa()
  2. Dim s1$, s2$, s$, arr(1 To 5), i&, n&
  3. s1 = "76532": s2 = "98410"
  4. s1 = Replace(s1, Mid(s1, Int(Rnd * 5) + 1, 1), "")
  5. s = s1 & Mid(s2, Int(Rnd * 5) + 1, 1)
  6. Do While i < 5
  7.   n = Int(Rnd() * 5) + 1
  8.   If arr(n) = "" Then
  9.     i = i + 1
  10.     arr(n) = Mid(s, i, 1)
  11.   End If
  12. Loop
  13. MsgBox Join(arr, "")
  14. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-8-31 17:17 | 显示全部楼层
谢谢“大灰狼1976”老师,你是我的大恩人!我对你的公式特别感兴趣,正在学习。你说公式前面加--,我好像不加也可以。这是数组公式吗?结果如果第一个是“0”,能够显示吗?
回复

使用道具 举报

 楼主| 发表于 2017-8-31 17:23 | 显示全部楼层
大灰狼1976 发表于 2017-8-31 16:45
VBA随机取数乱序输出。

A1、B1数据是举例说明,不一定是76532,98410。
回复

使用道具 举报

 楼主| 发表于 2017-8-31 17:54 | 显示全部楼层
请问老师,公式前面加不加“--”,对结果有影响吗?还有,我发现把光标放在公式栏上面,再次敲回车,结果和之前不一样,同样的数据源,哪些情况下结果会改变?
回复

使用道具 举报

 楼主| 发表于 2017-8-31 20:32 | 显示全部楼层
请问老师,下面3个公式哪个随机分布更加均匀?哪个更好一些?
=REPLACE(A1,5*RAND()+1,1,"")& MID(B1,5*RAND()+1,1)
=REPLACE(A1,5*RAND()+1,1, MID(B1,5*RAND()+1,1))
=SUBSTITUTE(A1,MID(A1,INT(RAND()*5)+1,1),"")&MID(B1,INT(RAND()*5)+1,1)
回复

使用道具 举报

 楼主| 发表于 2017-8-31 23:04 | 显示全部楼层
实际上,我的问题是2部分组成:A1中5个数字随机抽取4个,是5个组合;B1中5个数字随机抽取1个,也是5个组合,2者相乘,一个25个组合。
我有一个疑问,无论是用=REPLACE(A1,5*RAND()+1,1,""),= MID(B1,5*RAND()+1,1),=SUBSTITUTE(A1,MID(A1,INT(RAND()*5)+1,1),""),=MID(B1,INT(RAND()*5)+1,1)分开执行;还是用=REPLACE(A1,5*RAND()+1,1,"")& MID(B1,5*RAND()+1,1),=SUBSTITUTE(A1,MID(A1,INT(RAND()*5)+1,1),"")&MID(B1,INT(RAND()*5)+1,1)合起来执行,都发现重复的很多。
分开执行5次,至少2次重复;合起来执行25次,至少7、8次重复。
哪位高手能够解释!
回复

使用道具 举报

 楼主| 发表于 2017-8-31 23:51 | 显示全部楼层
请“大灰狼”老师能不能用代码帮我重新写一遍,我觉得用代码执行比较好。
A1、B1数据是举例说明,不一定是76532,98410。
谢谢你!
回复

使用道具 举报

发表于 2017-9-1 10:57 | 显示全部楼层
实际上很简单,A1数据随机去掉一个,共5种可能,B1数据随机取一个,也是5种可能,结果跟你的理解一致,但是取A1数据时,随机取4个的效率比随机去掉1个的效率低4倍(实际不止4倍,因为要考虑不能重复取同一个数)。
目前的代码和公式的分布都是均匀的,只不过公式没有考虑乱序输出而已。
上面的代码直接可以用,把s1 = "76532": s2 = "98410"红字部分换成你需要取值的单元格就行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 03:26 , Processed in 0.366392 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表