用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),而用round可用round(rand()*20+16),这后面的+16放括号里面外面都一样,因为取整操作是由小数部分决定的。
还有我第二个if的判断用的是rand()<0.6而不是小于0.3,这是因为第二个if会执行的机率是50%,50%乘以0.6就是30%。
后来楼主同学又出怪招,要求每组无重复数字,每组从小到大排列。
这个只用单纯的公式的话不好办了。
我写了个VBA:
Sub madeRnd()
Dim i, j, k, a(8), flag, t
Sheets("Sheet1").Select
For k = 1 To 500
'生成一组随机数字
For i = 1 To 8
flag = 0
Do
Randomize
t = Rnd()
If t < 0.5 Then
a(i) = Int(Rnd() * 15 + 1)
ElseIf t < 0.8 Then
a(i) = Int(Rnd() * 21 + 16)
Else
a(i) = Int(Rnd() * 14 + 37)
End If
If i >= 2 Then
For j = 1 To i - 1
If a(i) = a(j) Then
flag = 1
Exit For
Else
flag = 0
End If
Next j
End If
Loop While flag = 1
Next i
'给随机数排序
For i = 7 To 1 Step -1
For j = 1 To i
If a(j) > a(j + 1) Then
a(0) = a(j)
a(j) = a(j + 1)
a(j + 1) = a(0)
End If
Next j
Next i
'输出一组随机数字
For i = 1 To 8
Cells(k, i) = a(i)
Next i
Next k
End Sub
很奇怪,我在表格上用公式写了个机率统计,就是统计这8*500个单元格的数据分布。
发现我开始用公式生成的机率很正常,非常接近50%,30%,20%这个比例,波动不超过1%。
而用VBA生成的数据,机率就有点偏,总是在48%,31%,21%这样子。
我不得不调整一下,如把VBA里面的判断条件t<0.5稍微改下,改成t<0.5+0.0175这样子。稍微调高1-15出现的机率。
这是什么原因?难道是VBA的rnd()函数没有EXCEL表格函数的rand()公正?
可以谢幕了吗?no!!there is no little case in
怪同学又来了,再次提出无理要求,要求可以方便的随意更改数字范围。
这。。。
只能用上传说中的人机交互接口了。
其实就是个窗体啦。。
这里贴张图片。
这个从上面的VBA改一改就可以了。(修改:对了,我后来才发现,我的排序居然没起作用。原来排序的语句我写成for i = 7 to 1,汗,高一时学的basic,早忘得差不多了,这里应该改成for i = 7 to 1 step -1,我上面的VBA代码已经改好了。这个排序正确的图片就不再重发了。)
最后再提一点,回答问题的可不止我一个,有一位“小”兄弟,也是写的VBA。
我看了下他的,跟我的思路不一样,他的可是绝对的50:30:20的比例。
他的方法大概是这样的:从8乘500的单元格里,随意抽取一个单元格,如果单元格为空,就往里面填数据。抽取2000次填1-15的随机数,抽取1200次填16-36的随机数,抽取800次填37-50的随机数。
我的思路?就跟我那个VBA一样的,生成一个随机数,根据它的取值来决定生成哪个区间的整数。
最后还有一位神级大哥,他的方法已经是大道天成,已经达到了手中无剑,心中有剑,万物皆可为剑的至高境界。方法很简单,我直接复制他的过来:
excel的随机数函数
1.首先
工具-加载宏,勾选分析工具库.
勾选后,工具菜单下出现"数据分析"菜单
2.在A1:A50输入序列1-50
B1:B15输入=0.5/50
B16:B36输入=0.3/21
B37:B50输入=0.2/14
3.工具-数据分析,随机数字发生器.
变量个数:8
随机数个数:500
分布:离散
数值与概率输入区域:A1:B50
输出新工作表组,默认不改即可.
确定.
从小到大排序显示:
I1输入公式:
=SMALL($A1:$H1,COLUMN(A1))
向右拖动填充公式到P1,
然后选中I1:P1
向下拖动到P500
这个,EXCEL真强大。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论