Ross《随机过程》(第二版)装填问题Python模拟实验
實(shí)驗(yàn)環(huán)境:
python2.7
運(yùn)行時(shí)重定向到輸出文件即可:
python x.py > result.log
我們打算分三種情況模擬:
一,模擬直線末端為孤立點(diǎn)的情況,以P6為例進(jìn)行模擬
二、模擬直線最中間的點(diǎn)為孤立點(diǎn)的情況,以P5,9為例進(jìn)行模擬
三、模擬直線非最中間、非末端的點(diǎn)為孤立點(diǎn)的情況,以P5,10為例進(jìn)行模擬
代碼模擬思想是:
對(duì)于n個(gè)點(diǎn),使用一個(gè)n-1長(zhǎng)度的數(shù)組來(lái)放置n-1個(gè)隨機(jī)數(shù)
數(shù)組中每個(gè)元素初始為-1,表示該數(shù)兩側(cè)的點(diǎn)沒(méi)有連接,
后期若該元素為非-1,則表示該數(shù)兩側(cè)的點(diǎn)有連接,成為“相鄰數(shù)對(duì)”
對(duì)于直線兩端的端點(diǎn),必須有“連續(xù)的2個(gè)-1”才表示能繼續(xù)選擇“相鄰數(shù)對(duì)”
對(duì)于直線非兩端的端點(diǎn),必須有“連續(xù)的3個(gè)-1”才表示能繼續(xù)選擇“相鄰數(shù)對(duì)”
每次選擇“相鄰數(shù)對(duì)”后,都要檢查當(dāng)前直線是否還能繼續(xù)放置數(shù)對(duì),
若不能繼續(xù)放置數(shù)對(duì),則跳出while循環(huán),進(jìn)行下一輪實(shí)驗(yàn)。
-----------------------------------------------------------------------------------------------
一、首先模擬Pn(n=6),代碼如下:
#=*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') n=6 a = [-1] * (n-1) #定義一個(gè)長(zhǎng)度為10的list print a # 100個(gè)點(diǎn),來(lái)模擬101個(gè)數(shù),初始化為-1,-1表示該數(shù)左右兩側(cè)沒(méi)有連接 #如果最終結(jié)果中有兩個(gè)數(shù)為空(-1),則表示,這兩個(gè)數(shù)之間的點(diǎn)是孤立的。 #如果最終結(jié)果中有一個(gè)數(shù)為空(-1),則表示,這兩個(gè)數(shù)之間沒(méi)有點(diǎn)孤立 #如果運(yùn)行過(guò)程中存在連續(xù)三個(gè)數(shù)為空(-1),說(shuō)明該輪隨機(jī)過(guò)程還沒(méi)結(jié)束,需要繼續(xù)進(jìn)行。 #判斷第i個(gè)點(diǎn)孤立的充分必要條件是:a[i-1]!=-1并且a[i-2]!=-1def print_a(a):#輸出隨機(jī)產(chǎn)生的最終結(jié)果print"\n--------最終產(chǎn)生的點(diǎn)對(duì)----"print"a=",afor index,item in enumerate(a):if index==0 and item!=-1:print"1 - 2",if index==0 and item==-1:print"1 2",if index>0 and item!=-1:print '-',index+2,if index>0 and item==-1:print index+2,print"\n"print"-"*30import random Flag=0#用來(lái)判斷當(dāng)前直線上是否還剩下可以選擇的數(shù)對(duì),0表示不存在,1表示還存在可以選擇的“相鄰數(shù)對(duì)” i_nopairs=n-1#檢驗(yàn)Pn是否為孤立點(diǎn) i_isolated=0#統(tǒng)計(jì)第i個(gè)點(diǎn)最終被孤立的次數(shù) i_pairs=0#統(tǒng)計(jì)第i個(gè)點(diǎn)最終不被孤立的次數(shù) experiment=30000#總實(shí)驗(yàn)次數(shù)for index in range(experiment):print"-----------------------------index=%d-------------------------------"%indexa = [-1] * (n-1)#新的一輪實(shí)驗(yàn)開始,整個(gè)隊(duì)列清零while True:Flag=0point_pairs= random.randrange(0,n-1,1)#產(chǎn)生的隨機(jī)數(shù)∈[0,n-1),共n-1個(gè),下標(biāo)范圍是0~n-2print"point_pairs=",point_pairsif (point_pairs!=n-2 and point_pairs !=0) and point_pairs-a[point_pairs-1]==point_pairs-a[point_pairs+1]==point_pairs+1:#確保左右兩側(cè)都沒(méi)有點(diǎn)對(duì),才能落子a[point_pairs]=point_pairsif point_pairs==0 and a[1]==-1:#最左側(cè)的點(diǎn)對(duì),落筆時(shí)需要考慮確保第2個(gè)點(diǎn)和第3個(gè)點(diǎn)沒(méi)有連接成對(duì)a[point_pairs]=point_pairsif point_pairs==n-2 and a[n-3]==-1:#最右側(cè)的點(diǎn)對(duì),落筆時(shí)需要考慮確保第2個(gè)點(diǎn)和第個(gè)點(diǎn)沒(méi)有連接成對(duì)a[point_pairs]=point_pairsprint"-"*10print a[point_pairs]print"-"*10for i in range(n-3):#檢查整條直線中是否還有可選擇“相鄰數(shù)對(duì)”的余地,如果沒(méi)有了,那么本輪實(shí)驗(yàn)結(jié)束if a[i]+a[i+1]+a[i+2]==-3:#············○ a[i] ○ a[i+1] ○ a[i+2] ○············Flag=1breakif a[0]+a[1]==-2 or a[n-3]+a[n-2]==-2:#直線開頭最多只能空兩個(gè)數(shù),表示的含義是○ ○ ○-○······Flag=1break#---------------------------------------if Flag==1:continueif Flag==0:if a[i_nopairs-1]==-1:i_isolated=i_isolated+1print(a)break #------------------------------這里對(duì)Pn進(jìn)行驗(yàn)證----------------------------------------------------------experiment=experiment*1.0 print"i_isolated=",i_isolated print"The ratio of ith point isolated is:",i_isolated/experiments實(shí)驗(yàn)結(jié)果是:
上述模擬實(shí)驗(yàn)為30000輪,最終第6個(gè)點(diǎn)被孤立的頻率是11007/30000
書上理論計(jì)算P6=11/30
所以理論計(jì)算與實(shí)驗(yàn)結(jié)果十分接近
--------------------------------------------------------------------------------------------------------------
二、接下來(lái)模擬Pi,n(i=5,n=9,這是對(duì)稱情況,i處于最中央),代碼如下:
#=*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') n=9 i_nopairs=5#想孤立第5個(gè)點(diǎn)a = [-1] * (n-1) #定義一個(gè)長(zhǎng)度為10的list print a # 100個(gè)點(diǎn),來(lái)模擬101個(gè)數(shù),初始化為-1,-1表示該數(shù)左右兩側(cè)沒(méi)有連接 #如果最終結(jié)果中有兩個(gè)數(shù)為空(-1),則表示,這兩個(gè)數(shù)之間的點(diǎn)是孤立的。 #如果最終結(jié)果中有一個(gè)數(shù)為空(-1),則表示,這兩個(gè)數(shù)之間沒(méi)有點(diǎn)孤立 #如果運(yùn)行過(guò)程中存在連續(xù)三個(gè)數(shù)為空(-1),說(shuō)明該輪隨機(jī)過(guò)程還沒(méi)結(jié)束,需要繼續(xù)進(jìn)行。 #判斷第i個(gè)點(diǎn)孤立的充分必要條件是:a[i-1]!=-1并且a[i-2]!=-1def print_a(a):#輸出隨機(jī)產(chǎn)生的最終結(jié)果print"\n--------最終產(chǎn)生的點(diǎn)對(duì)----"print"a=",afor index,item in enumerate(a):if index==0 and item!=-1:print"1 - 2",if index==0 and item==-1:print"1 2",if index>0 and item!=-1:print '-',index+2,if index>0 and item==-1:print index+2,print"\n"print"-"*30import random Flag=0#用來(lái)判斷當(dāng)前直線上是否還剩下可以選擇的數(shù)對(duì),0表示不存在,1表示還存在可以選擇的“相鄰數(shù)對(duì)”i_isolated=0#統(tǒng)計(jì)第i個(gè)點(diǎn)最終被孤立的次數(shù) i_pairs=0#統(tǒng)計(jì)第i個(gè)點(diǎn)最終不被孤立的次數(shù) experiment=128000#總實(shí)驗(yàn)次數(shù)for index in range(experiment):print"-----------------------------index=%d-------------------------------"%indexa = [-1] * (n-1)#新的一輪實(shí)驗(yàn)開始,整個(gè)隊(duì)列清零while True:Flag=0#每次選擇”相鄰數(shù)對(duì)“時(shí),假定整條直線已經(jīng)沒(méi)有剩下可以選擇的數(shù)對(duì)了。point_pairs= random.randrange(0,n-1,1)#產(chǎn)生的隨機(jī)數(shù)∈[0,n-1),共n-1個(gè),下標(biāo)范圍是0~n-2print"point_pairs=",point_pairsif (point_pairs!=n-2 and point_pairs !=0) and point_pairs-a[point_pairs-1]==point_pairs-a[point_pairs+1]==point_pairs+1:#確保左右兩側(cè)都沒(méi)有點(diǎn)對(duì),才能落子a[point_pairs]=point_pairsif point_pairs==0 and a[1]==-1:#最左側(cè)的點(diǎn)對(duì),落筆時(shí)需要考慮確保第2個(gè)點(diǎn)和第3個(gè)點(diǎn)沒(méi)有連接成對(duì)a[point_pairs]=point_pairsif point_pairs==n-2 and a[n-3]==-1:#最右側(cè)的點(diǎn)對(duì),落筆時(shí)需要考慮確保第2個(gè)點(diǎn)和第個(gè)點(diǎn)沒(méi)有連接成對(duì)a[point_pairs]=point_pairsprint"-"*10print a[point_pairs]print"-"*10for i in range(n-3):#檢查整條直線中是否還有可選擇“相鄰數(shù)對(duì)”的余地,如果沒(méi)有了,那么本輪實(shí)驗(yàn)結(jié)束if a[i]+a[i+1]+a[i+2]==-3:#············○ a[i] ○ a[i+1] ○ a[i+2] ○············Flag=1breakif a[0]+a[1]==-2 or a[n-3]+a[n-2]==-2:#直線開頭最多只能空兩個(gè)數(shù),表示的含義是○ ○ ○-○······Flag=1break#---------------------------------------if Flag==1:continueif Flag==0:if a[i_nopairs-2]==a[i_nopairs-1]==-1:#a[i_nopairs-2] i a[i_nopairs-1]i_isolated=i_isolated+1print(a)break #------------------------------這里對(duì)Pi,n進(jìn)行驗(yàn)證----------------------------------------------------------experiment=experiment*1.0 print"i_isolated=",i_isolated print"The ratio of ith point isolated is:",i_isolated/experiments?
實(shí)驗(yàn)結(jié)果為:
實(shí)驗(yàn)結(jié)果顯示:
第5個(gè)點(diǎn)為孤立的頻率是17934/128000
書上理論計(jì)算結(jié)果為9/64
所以理論計(jì)算結(jié)果與實(shí)驗(yàn)結(jié)果十分接近
---------------------------------------------------------------------------------------------------------
三、接下來(lái)模擬Pi,n(i=5,n=10,這是非對(duì)稱情況,i不再處于中央),稍作修改,代碼如下:
#=*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') n=10 i_nopairs=5#想孤立第5個(gè)點(diǎn)a = [-1] * (n-1) #定義一個(gè)長(zhǎng)度為10的list print a # 100個(gè)點(diǎn),來(lái)模擬101個(gè)數(shù),初始化為-1,-1表示該數(shù)左右兩側(cè)沒(méi)有連接 #如果最終結(jié)果中有兩個(gè)數(shù)為空(-1),則表示,這兩個(gè)數(shù)之間的點(diǎn)是孤立的。 #如果最終結(jié)果中有一個(gè)數(shù)為空(-1),則表示,這兩個(gè)數(shù)之間沒(méi)有點(diǎn)孤立 #如果運(yùn)行過(guò)程中存在連續(xù)三個(gè)數(shù)為空(-1),說(shuō)明該輪隨機(jī)過(guò)程還沒(méi)結(jié)束,需要繼續(xù)進(jìn)行。 #判斷第i個(gè)點(diǎn)孤立的充分必要條件是:a[i-1]!=-1并且a[i-2]!=-1def print_a(a):#輸出隨機(jī)產(chǎn)生的最終結(jié)果print"\n--------最終產(chǎn)生的點(diǎn)對(duì)----"print"a=",afor index,item in enumerate(a):if index==0 and item!=-1:print"1 - 2",if index==0 and item==-1:print"1 2",if index>0 and item!=-1:print '-',index+2,if index>0 and item==-1:print index+2,print"\n"print"-"*30import random Flag=0#用來(lái)判斷當(dāng)前直線上是否還剩下可以選擇的數(shù)對(duì),0表示不存在,1表示還存在可以選擇的“相鄰數(shù)對(duì)”i_isolated=0#統(tǒng)計(jì)第i個(gè)點(diǎn)最終被孤立的次數(shù) i_pairs=0#統(tǒng)計(jì)第i個(gè)點(diǎn)最終不被孤立的次數(shù) experiment=80000#總實(shí)驗(yàn)次數(shù)for index in range(experiment):print"-----------------------------index=%d-------------------------------"%indexa = [-1] * (n-1)#新的一輪實(shí)驗(yàn)開始,整個(gè)隊(duì)列清零while True:Flag=0#每次選擇”相鄰數(shù)對(duì)“時(shí),假定整條直線已經(jīng)沒(méi)有剩下可以選擇的數(shù)對(duì)了。point_pairs= random.randrange(0,n-1,1)#產(chǎn)生的隨機(jī)數(shù)∈[0,n-1),共n-1個(gè),下標(biāo)范圍是0~n-2print"point_pairs=",point_pairsif (point_pairs!=n-2 and point_pairs !=0) and point_pairs-a[point_pairs-1]==point_pairs-a[point_pairs+1]==point_pairs+1:#確保左右兩側(cè)都沒(méi)有點(diǎn)對(duì),才能落子a[point_pairs]=point_pairsif point_pairs==0 and a[1]==-1:#最左側(cè)的點(diǎn)對(duì),落筆時(shí)需要考慮確保第2個(gè)點(diǎn)和第3個(gè)點(diǎn)沒(méi)有連接成對(duì)a[point_pairs]=point_pairsif point_pairs==n-2 and a[n-3]==-1:#最右側(cè)的點(diǎn)對(duì),落筆時(shí)需要考慮確保第2個(gè)點(diǎn)和第個(gè)點(diǎn)沒(méi)有連接成對(duì)a[point_pairs]=point_pairsprint"-"*10print a[point_pairs]print"-"*10for i in range(n-3):#檢查整條直線中是否還有可選擇“相鄰數(shù)對(duì)”的余地,如果沒(méi)有了,那么本輪實(shí)驗(yàn)結(jié)束if a[i]+a[i+1]+a[i+2]==-3:#············○ a[i] ○ a[i+1] ○ a[i+2] ○············Flag=1breakif a[0]+a[1]==-2 or a[n-3]+a[n-2]==-2:#直線開頭最多只能空兩個(gè)數(shù),表示的含義是○ ○ ○-○······Flag=1break#---------------------------------------if Flag==1:continueif Flag==0:if a[i_nopairs-2]==a[i_nopairs-1]==-1:#a[i_nopairs-2] i a[i_nopairs-1]i_isolated=i_isolated+1print(a)break #------------------------------這里對(duì)Pi,n進(jìn)行驗(yàn)證----------------------------------------------------------experiment=experiment*1.0 print"i_isolated=",i_isolated print"The ratio of ith point isolated is:",i_isolated/experiment?
實(shí)驗(yàn)結(jié)果是:
由實(shí)驗(yàn)結(jié)果可知,10個(gè)點(diǎn)中,第5個(gè)點(diǎn)為孤立點(diǎn)的頻率為:10960/80000
由書上理論可知:P5,10=P5·P6=(3/8)(11/30)=11/80
所以實(shí)驗(yàn)結(jié)果與理論結(jié)果十分接近。
總結(jié)
以上是生活随笔為你收集整理的Ross《随机过程》(第二版)装填问题Python模拟实验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 验证Ross《随机过程》(第二版)1.9
- 下一篇: python之setdefault()和