数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 4733|回复: 5

连进两次、单进一次、单不进一次、连不进两次,再进概率为0.9,0.8,0.6,0.5,求总

[复制链接]
发表于 2014-2-20 16:36 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2014-2-21 12:14 | 显示全部楼层

连进两次、单进一次、单不进一次、连不进两次,再进概率为0.9,0.8,0.6,0.5,求总进球数

[这个贴子最后由天山草在 2014/02/21 00:23pm 第 4 次编辑] 我用随机数发生器编程来解答,结果与楼主的有些差异。不知何故? VB6 程序如下:              '; 某人投篮:     '; 若前次和上次均投进,  则本次投进的概率为0.9,     '; 若前次未进而上次投进,则本次投进的概率为0.8,     '; 若前次投进而上次未进,则本次投进的概率为0.6,     '; 若前次和上次均未投进,则本次投进的概率为0.5。         '; 问:他投篮 10000 次,投进球的总数大致有多少个?             Private Sub form_Click()             Dim k As String   Randomize ';启动随机数发生器       ss = 0     For m = 1 To 1000  ';共做一千次试验     If (m + 0) / 4 = Int((m + 0) / 4) Then k = "11"   ';前次和上次均投进     If (m + 1) / 4 = Int((m + 1) / 4) Then k = "01"   ';前次未进而上次投进     If (m + 2) / 4 = Int((m + 2) / 4) Then k = "10"   ';前次投进而上次未进     If (m + 3) / 4 = Int((m + 3) / 4) Then k = "00"   ';前次和上次均未进         kk = k         s = 0     For n = 1 To 10000   ';投篮总次数为 1 万次,这算做一次试验       A = Rnd   ';产生一个大于零、小于 1 的随机正数          If k = "11" Then   ';前次和上次均投进         If A <= 0.9 Then   ';本次投进         s = s + 1         k = "11"         Else     ';本次未进         k = "10"         End If       End If              If k = "01" Then   ';前次未进,上次进         If A <= 0.8 Then   ';本次投进         s = s + 1         k = "11"         Else     ';本次未进         k = "10"         End If       End If            If k = "10" Then   ';前次进,上次未进         If A <= 0.6 Then   ';本次投进         s = s + 1         k = "01"         Else     ';本次未进         k = "00"         End If       End If             If k = "00" Then   ';前次及上次都未进         If A <= 0.5 Then   ';本次投进         s = s + 1         k = "01"         Else     ';本次未进         k = "00"         End If       End If           Next n       Print m; " "; kk; "  "; Format(s, "####")             ss = ss + s     Next m       m = m - 1       Print             Print "平均值 s = "; Format(ss / m, "####")     End Sub  ------------------------------------------------------- 上面这程序的运行结果是: 【下表第 1 列是试验次数,每投 1 万次算做 1 次试验,】 【下表第 2 列是初始状态,就是本次投球时,前面投进的情况】 【下表第 3 列是该次试验的结果,就是投完 1 万个球以后,统计投进的总数】 【下表最后一行,是 1000 次试验的平均值,等于 8181 】 1  00  8255 2  10  8246 3  01  8204 4  11  8197 5  00  8163 6  10  8163 7  01  8173 8  11  8125 9  00  8193 10  10  8207 11  01  8275 12  11  8157 13  00  8082 14  10  8150 15  01  8248 16  11  8157 17  00  8229 18  10  8131 19  01  8233 20  11  8130 21  00  8249 22  10  8144 23  01  8335 24  11  8207 25  00  8151 26  10  8277 27  01  8133 28  11  8188 29  00  8091 30  10  8214 31  01  8169 32  11  8184 33  00  8202 34  10  8183 35  01  8191 ……………… 997  00  8091 998  10  8042 999  01  8257 1000  11  8215 平均值 s = 8181 [br][br]-=-=-=-=- 以下内容由 天山草 时添加 -=-=-=-=- 再运行一次为 8183, 再运行一次为 8180,
发表于 2014-2-21 12:50 | 显示全部楼层

连进两次、单进一次、单不进一次、连不进两次,再进概率为0.9,0.8,0.6,0.5,求总进球数

如果将上述程序改为——
    '; 某人投篮:
    '; 若前次和上次均投进,  则本次投进的概率为0.8,
    '; 若前次未进而上次投进,则本次投进的概率为0.8,
    '; 若前次投进而上次未进,则本次投进的概率为0.6,
    '; 若前次和上次均未投进,则本次投进的概率为0.6。
   
    '; 问:他投篮 10000 次,投进球的总数大致有多少个?
……………………
则程序运行的结果约为 7500 个。
 楼主| 发表于 2014-2-21 17:11 | 显示全部楼层

连进两次、单进一次、单不进一次、连不进两次,再进概率为0.9,0.8,0.6,0.5,求总进球数

楼上程序中 If k = "11" Then ';前次和上次均投进 If k = "01" Then ';前次未进,上次进 If k = "10" Then ';前次进,上次未进 If k = "00" Then ';前次及上次都未进 这四种情况的关系,应该是互相排斥的,每一次循环,只发生其中一种情况,只做一次。 可是因为你在后面几个 If 的前面少了 Else 语句,变成了前面做了后面还要再做的关系。 所以结果就不对了。 下面是我用 Pascal(Delphi) 语言编的程序以及计算结果: var m,n,s: integer; ss: longint; k,kk: string; a: real; begin randomize; ss:=0; for m:=1 to 1000 do begin if m mod 4=0 then k:=';11';; if m mod 4=1 then k:=';01';; if m mod 4=2 then k:=';01';; if m mod 4=3 then k:=';00';; kk:=k; s:=0; for n:=1 to 10000 do begin a:=random; if k=';11'; then begin if a<=0.9 then begin s:=s+1; k:=';11';; end else k:=';10';; end else if k=';01'; then begin if a<=0.8 then begin s:=s+1; k:=';11';; end else k:=';10';; end else if k=';10'; then begin if a<=0.6 then begin s:=s+1; k:=';01';; end else k:=';00';; end else if k=';00'; then begin if a<=0.5 then begin s:=s+1; k:=';01';; end else k:=';00';; end; end; writeln(m:5,kk:4,s:5); ss:=ss+s; end; writeln; writeln('; s = ';,ss/1000:6:2); end. --------------------------------------------------- 1 01 8383 2 01 8342 3 00 8338 4 11 8300 5 01 8364 6 01 8341 7 00 8307 8 11 8414 9 01 8295 10 01 8291 11 00 8299 12 11 8389 13 01 8363 14 01 8333 15 00 8392 16 11 8304 17 01 8371 18 01 8274 19 00 8320 20 11 8394 21 01 8284 22 01 8314 23 00 8233 24 11 8412 25 01 8340 26 01 8372 27 00 8299 28 11 8312 ………… 990 01 8318 991 00 8356 992 11 8274 993 01 8396 994 01 8340 995 00 8467 996 11 8320 997 01 8404 998 01 8345 999 00 8352 1000 11 8388 s = 8335.08
发表于 2014-2-22 08:42 | 显示全部楼层

连进两次、单进一次、单不进一次、连不进两次,再进概率为0.9,0.8,0.6,0.5,求总进球数

谢谢陆教授的解答。我再想一想吧。
发表于 2014-2-22 10:15 | 显示全部楼层

连进两次、单进一次、单不进一次、连不进两次,再进概率为0.9,0.8,0.6,0.5,求总进球数

[这个贴子最后由天山草在 2014/02/22 10:26am 第 3 次编辑] 噢,我想明白了。为使程序简单易懂,要在其中加入一些 goto 语句,虽然 goto 语句不是正规的武器。    程序改为下面这样,运行结果即是 8333:   '; 某人投篮,若前次和上次均投进,则本次投进的概率为0.9,     '; 若前次未进而上次投进,则本次投进的概率为0.8,     '; 若前次投进而上次未进,则本次投进的概率为0.6,     '; 若前次和上次均未投进,则本次投进的概率为0.5。         '; 问:他投篮 10000 次,投进球的总数大致有多少个?             Private Sub form_Click()             Dim k As String     Randomize     ';启动随机数发生器     ss = 0     For m = 1 To 10000     If (m + 0) / 4 = Int((m + 0) / 4) Then k = "11"   ';前次和上次均投进,     If (m + 1) / 4 = Int((m + 1) / 4) Then k = "01"   ';前次未进而上次投进     If (m + 2) / 4 = Int((m + 2) / 4) Then k = "10"   ';前次投进而上次未进     If (m + 3) / 4 = Int((m + 3) / 4) Then k = "00"   ';前次和上次均未进         kk = k         s = 0     For n = 1 To 10000   ';投篮总次数           A = Rnd   ';产生一个大于零、小于 1 的随机正数          If k = "11" Then   ';前次和上次均投进         If A <= 0.9 Then   ';本次投进         s = s + 1         k = "11"         [color=#FF0000]GoTo 99         Else     ';本次未进         k = "10"         [color=#FF0000]GoTo 99         End If       End If              If k = "01" Then   ';前次未进,上次进         If A <= 0.8 Then   ';本次投进         s = s + 1         k = "11"         [color=#FF0000]GoTo 99         Else     ';本次未进         k = "10"         [color=#FF0000]GoTo 99         End If       End If            If k = "10" Then   ';前次进,上次未进         If A <= 0.6 Then   ';本次投进         s = s + 1         k = "01"         [color=#FF0000]GoTo 99         Else     ';本次未进         k = "00"         [color=#FF0000]GoTo 99         End If       End If             If k = "00" Then   ';前次及上次都未进         If A <= 0.5 Then   ';本次投进         s = s + 1         k = "01"         [color=#FF0000]GoTo 99         Else     ';本次未进         k = "00"         [color=#FF0000]GoTo 99         End If       End If       [color=#FF0000]99:    Next n       Print m; " "; kk; "  "; Format(s, "####")             ss = ss + s     Next m       m = m - 1       Print             Print "平均值 s = "; Format(ss / m, "####")           End Sub ---------------------------------------------------------------- 共做一万次试验,平均结果是 8333: 1  00  8320 2  10  8315 3  01  8334 4  11  8334 5  00  8356 6  10  8304 7  01  8298 8  11  8269 9  00  8237 10  10  8409 11  01  8293 12  11  8300 13  00  8387 14  10  8350 15  01  8273 16  11  8365 …………………… 9995  01  8290 9996  11  8373 9997  00  8412 9998  10  8348 9999  01  8329 10000  11  8346 平均值 s = 8333 [color=#FF0000]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2026-1-13 13:47 , Processed in 0.113796 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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