|
|
概率求解
|
[这个贴子最后由天山草在 2012/07/21 08:11am 第 1 次编辑]
这个问题的概率叫做“超几何分布”问题,属于抽样检验理论。
下面是这个问题的 VB 计算机程序,供参考。
';超几何分布计算
Private Sub form_Click()
';批量为 n 的一批产品,其中有 r 件不合格品。从中抽取 n1 件,恰有 r1 件是不合格品的概率 p 是多少?
';p = (n-r, n1-r1)*(r, r1)/(n, n1)
';
Open "概率.txt" For Output As #1
Dim a2 As String ';作为字符串输入的第一个乘数
Dim b2 As String ';作为字符串输入的第二个乘数
Dim c2 As String ';作为字符串输出的计算结果(乘积)
Dim aa2(100000) As Long ';该数组存放乘数 a2 的各位数
Dim bb2(100000) As Long ';该数组存放乘数 b2 的各位数
Dim cc2(200000) As Long ';该数组存放乘积 c2 的各位数
Dim a1(10000) As Long ';……………… 被除数的各位数字
Dim ay(10000) As Long ';……………… 余数的各位数字(最后一次试商要修正时)
Dim b1(10000) As Long ';……………… 除数的各位数字
Dim c1(10000) As Long ';……………… 近似商与除数相乘后的各位数字
Dim d(10) As Long
Dim aa1 As String ';作为被除数的输入字符串
Dim bb1 As String ';作为除数的输入字符串
Dim pp As String ';作为商的输出字符串
Dim s1(10000) As Long ';……………… 商的各位数字
Dim js As Long '; js 是商的位数加一
Dim ta, tb, j, ee As Long
Dim fa As Long ';………………………… 被除数的位数
Dim fb As Long ';………………………… 除数的位数
n = "100"
r = "15"
n1 = "10"
r1 = "1" ';p = 0.3567803900
GoSub sub0
Print "p = "; Format(p, "0.0000000000")
Print #1, "p = "; Format(p, "0.0000000000")
999: Close
Exit Sub
sub0: ';计算组合 (r, r1)=z1
nnn2 = r: nnn1 = r1
GoSub sub1
z1 = pp
';计算组合 (n-r, n1-r1)=z2
nnn2 = n - r: nnn1 = n1 - r1
GoSub sub1
z2 = pp
';计算组合 (n, n1)=z3
nnn2 = n: nnn1 = n1
GoSub sub1
z3 = pp
';计算 z1 * z2 / z3
a2 = z1: b2 = z2
GoSub sub2
p = Val(c2) / Val(z3)
Return
sub1: ';计算组合数
c2 = "1"
For iii = Val(nnn1) + 1 To Val(nnn2) ';计算 nnn2!/nnn1!
a2 = c2: b2 = iii
GoSub sub2 ';调用乘法子程序
Next iii
FZ = c2 '; nnn2!/nnn1!
c2 = "1"
For iii = 1 To Val(nnn2) - Val(nnn1) ';计算 (nnn2 - nnn1)!
a2 = c2: b2 = iii
GoSub sub2 ';调用乘法子程序
Next iii
FM = c2 '; (nnn2 - nnn1)!
aa1 = FZ: bb1 = FM
GoSub sub3 ';调用除法子程序
Return ';组合结果为 pp 字串
sub2: ';正负数乘法子程序
FH2 = "" ';确定积的符号:
If Mid(a2, 1, 1) = "-" And Mid(b2, 1, 1) <> "-" Or _
Mid(b2, 1, 1) = "-" And Mid(a2, 1, 1) <> "-" Then FH2 = "-"
If Mid(a2, 1, 1) = "-" Then a2 = Mid(a2, 2)
If Mid(b2, 1, 1) = "-" Then b2 = Mid(b2, 2)
La2 = Len(a2): Lb2 = Len(b2): Lc2 = La2 + Lb2
For i2 = 1 To La2: aa2(i2) = Mid(a2, 1 + La2 - i2, 1): Next
For i2 = 1 To Lb2: bb2(i2) = Mid(b2, 1 + Lb2 - i2, 1): Next
For i2 = 1 To La2: For j2 = 1 To Lb2
p2 = i2 + j2: q2 = p2 - 1
nn2 = aa2(i2) * bb2(j2): nn02 = Int(nn2 / 10): nn12 = nn2 - 10 * nn02
cc2(q2) = cc2(q2) + nn12: cc2(p2) = cc2(p2) + nn02 + Int(cc2(q2) / 10)
cc2(q2) = cc2(q2) - 10 * Int(cc2(q2) / 10)
Next j2, i2
c2 = "":
For i2 = Lc2 To 1 Step -1
If Mid$(c2, 1, 1) = "0" Then c2 = Mid$(c2, 2)
c2 = c2 & cc2(i2)
Next i2
For i2 = 1 To Lc2: cc2(i2) = 0: Next ';状态复原
c2 = FH2 + c2 ';相乘结果为 c2 串,带正负号
Return
sub3: ';大数相除
';如果除数位数小于 3 位,则分子分母同放大 100 倍:
If Len(bb1) <= 2 Then aa1 = aa1 + "00": bb1 = bb1 + "00"
';If Val(aa1) = 0 Then pp = "0": sy$ = "0": Return ';去掉此句,防止算大数“溢出”
If aa1 = bb1 + "0" Then Print "10": Print #1, "10": Return ';这是一种特殊情况
fa = Len(aa1) ';把被除数的各位数码放在数组 a1(i6)中
For i6 = 1 To fa: a1(i6) = Mid(aa1, fa - i6 + 1, 1): Next i6 ';a1(1)为最低位,a1(fa)为最高位
fb = Len(bb1) ';把除数的各位数码放在数组 b1(i6)中
For i6 = 1 To fb: b1(i6) = Mid(bb1, fb - i6 + 1, 1): Next i6 ';b1(1)为最低位,b1(fb)为最高位
';以下取除数的近似数
ee = b1(fb) * 1000 + (b1(fb - 1)) * 100 + b1(fb - 2) * 10 + b1(fb - 3) + 1: ta = fa: js = 0
For j6 = fa - fb + 1 To 1 Step -1 ';………… 做除法求商,求余数
js = js + 1: f = a1(ta) * 1000 + a1(ta - 1) * 100 + a1(ta - 2) * 10 + a1(ta - 3) ';取被除数的近似数
s1(js) = Int(f / ee) ';…………………………………… 试商
For i6 = 1 To fb: c1(i6) = b1(i6) * s1(js): Next i6 ';试商的积。近似商与除数相乘后的各位数字
d(0) = 0
For i6 = 1 To fb - 1 ';…………………………………… 满 10 进位
d(1) = Int((c1(i6) + d(0)) / 10): c1(i6) = c1(i6) + d(0) - d(1) * 10: d(0) = d(1)
Next i6
c1(fb) = c1(fb) + d(0): qq$ = ""
For i6 = fb To 1 Step -1: qq$ = qq$ & c1(i6): Next i6 ';… 求试商的精确积
For i6 = fb To 1 Step -1
a1(ta - fb + i6) = a1(ta - fb + i6) - c1(i6)
Next i6
For i6 = 1 To fb
If a1(ta - fb + i6) < 0 Then a1(ta - fb + i6) = a1(ta - fb + i6) + 10: a1(ta - fb + i6 + 1) = a1(ta - fb + i6 + 1) - 1
Next i6
a1(ta - 1) = a1(ta - 1) + a1(ta) * 10: ta = ta - 1
Next j6
a1(fb - 1) = a1(fb - 1) Mod (10)
For i6 = 1 To fb - 1
c1(1) = a1(i6) - b1(i6): ay(i6) = c1(1) ';最后一次试商要修正时,这就是余数各位数(除最高位)
If c1(1) < 0 Then ccc = -1: c1(1) = c1(1) + 10: a1(i6 + 1) = a1(i6 + 1) - 1
Next i6
c1(1) = a1(fb) - b1(fb)
ay(fb) = c1(1) ';最后一次试商要修正时,这就是余数的最高位
If c1(1) >= 0 Then s1(js) = s1(js) + 1 '; c(1) 不是负数时最后一次试商要加一
For i6 = js To 1 Step -1
If s1(i6) >= 10 Then s1(i6) = s1(i6) - 10: s1(i6 - 1) = s1(i6 - 1) + 1 ';由于修正,商的某一位有大于10者,要调整进位
Next i6
If js = 1 Then pp = s1(js) ';以下做出商的字符串 pp
If js >= 2 Then pp = 10 * s1(1) + s1(2)
For i6 = 3 To js: pp = pp & s1(i6): Next i6
If pp = "" Then pp = "0"
Return
End Sub
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|