-
用
EXCEL
按比例生成随机数(或叫按机率生
成随机数)
这是百度知道一位同学的提问。要求生成范围为
1
到
50
的随
机整数,并且,
1
-
15
的机率
为
50%
,
16
-
36
的机率为<
/p>
30%
,
37
-
50
的机率为
20%
< br>。同时还要求生成
500
组,每组
8
个。
我当时给出一个公式:
p>
=if(rand()<0.5,round(rand()*14,0)+1,if(ra
nd()<0.6,round(rand()*20,0)+16,round(r
a
nd()*13,0)+37))
这里说下用
round
p>
和用
int
的区别,用
int
生成
16
-
36
的随机数的话应该用
int(rand()*21
+16)
,
而用
round
可用
round(rand()*20+16)
,
这后面的
+16
放括号里面外面
都一样,因为取整操作是由小数部分决定的。
还有我第二个
if
的判断用的是
ra
nd()<0.6
而不是小于
0.3
,
这是因为第二个
if
会执行的
机率是<
/p>
50%
,
50%
乘以
0.6
就是
30%
。
后来楼主同学又出怪招,
要求每组无重复数字,每组从小到大排列。
这个只用单纯的公式的话不好办了。
我写了个
VBA
:
Sub madeRnd()
Dim i, j, k,
a(8), flag, t
Sheets(
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
个单元格的数据分布。
< br>
发现我开始用公式生成的机率很正常,非常接近
50%
,
30%
,
2
0%
这个比例,波动不超过
1%
。
p>
而用
VBA
生成
的数据,机率就有点偏,总是在
48%
,
31%
,
21%
这样子。
我不得不调整一下,
如把
VBA
里面的判断条件
t<0.5
稍
微改下,
改成
t<0.5+0.0175
这样子。
稍微调高
1
-
15
出现的机率。
这是什
么原因?难道是
VBA
的
rnd()<
/p>
函数没有
EXCEL
表格函数的
rand()
公正?
可以谢幕了吗?
no!!there is no
little case in the world.||||||
怪同学又来了,
再次提出无理要求,
要求可以方便的随意更改数字范围
。
这。。。
只能用上传说中的人机交互接口了。
其实就是个窗体啦。。
这里贴张图片。
-
-
-
-
-
-
-
-
-
上一篇:SIEMENS编程G代码指令一览表
下一篇:公路抗震设计midas软件使用