程序模拟抽奖流程图_一道与联欢会相关的概率统计题目的模拟仿真
繼續昨天的問題,回顧一下相應的規則。
1. 同學按座位號依次進行抽簽;
2. 抽簽過程中抽到的同學不能為之前已經抽到的同學;
3. 按照昨天的規則,為了計算簡便,可以抽到自己。
那么根據昨天的分析,我們得到的抽簽次數的理論平均值為
由于該問題的分析過于復雜,另外昨天解決該問題的時間也比較倉促,所以我們的分析和計算可能出現問題。那么我們可以借助一下計算機來模擬仿真一下這個問題。
其算法如下:
1. 設置了被抽獎人序號和每個同學抽獎次數的統計向量(分別為向量a和向量b),每個向量均是n維的,n是抽獎人數,并且每個向量初始值全部是0;
2. 設置一個n次的循環。在循環內部,當第k位同學在抽簽時,先設置一個從1到n的隨機數。如果這個隨機數在向量a中出現過,那么繼續制造一個從1到n的隨機數,然后將向量b中第k位的數字加上1,表示進行了一次抽簽的意思;如果這個隨機數在向量a中未出現過,則將向量b中第k位的數字加上1后,進入第k+1次的循環;
3. (2)中的過程一共進行k次;
4. 然后把向量b中的所有結果進行加和,得到本輪抽簽的總次數;
5. 為了能得到一個更準確的單輪抽簽次數的平均值,設置一個輪次數計算一下平均值即可。
MATLAB程序如下:
function?y=party1(n)
nn=linspace(0,0,n); ??????????????%%被抽獎人,向量a
con=linspace(0,0,n); ?????????????%%抽獎次數計數,向量b
for?i=1:n
????kk=ceil(rand()*n); ???????????%%被抽號碼
????for?k=1:1000*n
????????if?ismember(kk,nn)==1 ????%%繼續抽,是否有之前的元素
???????????kk=ceil(rand()*n);
???????????con(i)=con(i)+1;
????????else?break
????????end
????end?
????nn(i)=kk;
????con(i)=con(i)+1;
end
y=sum(con);
上面是單輪抽簽次數的模擬情況。下面是模擬輪數的情況。
function?y=partycon1(m,n) ?????%%m為輪次數,n為每輪多少人
mm=linspace(0,0,m);
for?i=1:m
????mm(i)=party(n);
end
y=mm;
在運行界面只需輸入下面兩行即可
>>partycon1(100,40)
>>mean(ans(:))
第一行是進行100輪的模擬,第二行是取這100輪平均值。
根據我們的理論計算,40人進行抽簽的抽簽平均次數約為171.14次,而我們的模擬計算結果如下表所示。
輪次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 平均 |
結果 | 170.41 | 166.34 | 179.12 | 165.97 | 169.34 | 170.79 | 174.30 | 167.36 | 175.94 | 171.06 |
注意,每輪測試100次,經過900輪測試,其平均抽簽次數為171.06,與理論計算結果差距微小,應該說我們昨天分析的是正確的。
下面我們要對規則進行一定的修改,也就是我們定義不能抽到自己,并定義抽到自己視為本次抽簽作廢(不在總的抽簽次數上加上1),然后我們先進行模擬,之后再進行理論分析。其模擬結果如下表:
輪次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 平均 |
結果 | 169.51 | 172.63 | 161.41 | 178.30 | 175.04 | 169.73 | 176.60 | 160.79 | 168.76 | 170.31 |
我們看,這兩個計算結果間的差距微小,甚至可以忽略不計,那么接下來我們需要從理論上解釋一下其原因,請看下回分解。
總結
以上是生活随笔為你收集整理的程序模拟抽奖流程图_一道与联欢会相关的概率统计题目的模拟仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python循环语句求素数_Pytho
- 下一篇: 上海欢乐谷入园要身份证吗