资源描述:
《用EXCEL按比例生成随机数.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用EXCEL按比例生成随机数(或叫按机率生成随机数)这是百度知道一位同学的提问。要求生成范围为1到50的随机整数,并且,1-15的机率为50%,16-36的机率为30%,37-50的机率为20%。同时还要求生成500组,每组8个。我当时给出一个公式:=if(rand()<0.5,round(rand()*14,0)+1,if(rand()<0.6,round(rand()*20,0)+16,round(rand()*13,0)+37))这里说下用round和用int的区别,用int生成16-36的随机数的话应该用int(rand()*21+16),
2、而用round可用round(rand()*20+16),这后面的+16放括号里面外面都一样,因为取整操作是由小数部分决定的。还有我第二个if的判断用的是rand()<0.6而不是小于0.3,这是因为第二个if会执行的机率是50%,50%乘以0.6就是30%。后来楼主同学又出怪招,要求每组无重复数字,每组从小到大排列。这个只用单纯的公式的话不好办了。我写了个VBA:SubmadeRnd()Dimi,j,k,a(8),flag,tSheets("Sheet1").SelectFork=1To500'生成一组随机数字Fori=1To8flag=0DoR
3、andomizet=Rnd()Ift<0.5Thena(i)=Int(Rnd()*15+1)ElseIft<0.8Thena(i)=Int(Rnd()*21+16)Elsea(i)=Int(Rnd()*14+37)EndIfIfi>=2ThenForj=1Toi-1Ifa(i)=a(j)Thenflag=1ExitForElseflag=0EndIfNextjEndIfLoopWhileflag=1Nexti'给随机数排序Fori=7To1Step-1Forj=1ToiIfa(j)>a(j+1)Thena(0)=a(j)a(j)=a(j+1)a(j
4、+1)=a(0)EndIfNextjNexti'输出一组随机数字Fori=1To8Cells(k,i)=a(i)NextiNextkEndSub很奇怪,我在表格上用公式写了个机率统计,就是统计这8*500个单元格的数据分布。发现我开始用公式生成的机率很正常,非常接近50%,30%,20%这个比例,波动不超过1%。而用VBA生成的数据,机率就有点偏,总是在48%,31%,21%这样子。我不得不调整一下,如把VBA里面的判断条件t<0.5稍微改下,改成t<0.5+0.0175这样子。稍微调高1-15出现的机率。这是什么原因?难道是VBA的rnd()函数
5、没有EXCEL表格函数的rand()公正?可以谢幕了吗?no!!thereisnolittlecaseintheworld.
6、
7、
8、
9、
10、
11、怪同学又来了,再次提出无理要求,要求可以方便的随意更改数字范围。这。。。只能用上传说中的人机交互接口了。其实就是个窗体啦。。这里贴张图片。这个从上面的VBA改一改就可以了。(修改:对了,我后来才发现,我的排序居然没起作用。原来排序的语句我写成fori=7to1,汗,高一时学的basic,早忘得差不多了,这里应该改成fori=7to1step-1,我上面的VBA代码已经改好了。这个排序正确的图片就不再重发了。)最后再
12、提一点,回答问题的可不止我一个,有一位“小色”兄弟,也是写的VBA。我看了下他的,跟我的思路不一样,他的可是绝对的50:30:20的比例。他的方法大概是这样的:从8乘500的单元格里,随意抽取一个单元格,如果单元格为空,就往里面填数据。抽取2000次填1-15的随机数,抽取1200次填16-36的随机数,抽取800次填37-50的随机数。我的思路?就跟我那个VBA一样的,生成一个随机数,根据它的取值来决定生成哪个区间的整数。最后还有一位神级大哥,他的方法已经是大道天成,已经达到了手中无剑,心中有剑,万物皆可为剑的至高境界。方法很简单,我直接复制他的
13、过来:1.首先工具-加载宏,勾选分析工具库.勾选后,工具菜单下出现"数据分析"菜单2.在A1:A50输入序列1-50B1:B15输入=0.5/50B16:B36输入=0.3/21B37:B50输入=0.2/143.工具-数据分析,随机数字发生器.变量个数:8随机数个数:500分布:离散数值与概率输入区域:A1:B50输出新工作表组,默认不改即可.确定.从小到大排序显示:I1输入公式:=SMALL($A1:$H1,COLUMN(A1))向右拖动填充公式到P1,然后选中I1:P1向下拖动到P500这个,EXCEL真强大。