最長遊程問題

關於這段的代碼dom

 

     static void T12()
        {
            var dic = new String[] { "H", "T" };
            var total =1000000;
            var count=0;
            var k = 5;
            var n = 30;
            var rnd=new Random(Environment.TickCount);
            var parser = new PoissonParser();
            for (int i = 0; i < total; i++)
            {
                var sb = new StringBuilder();
                for (int index = 0; index < n; index++)
                {
                    sb.Append(dic[rnd.Next(2)]);
                }
                sb.Append("T");
                var str = sb.ToString();
                //Console.WriteLine(str);
                var info=parser.Do(str, i, k);
                count += info.Count;
                //Console.WriteLine(info);
                
            }
            Console.WriteLine("Total:{0},Count:{1},Rate:{2}", total, count,(double) count / (double)total);
        }
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
   public class Poisson
    {
      
    }
   public class ParserInfo
   {
       public int TrialId { get; set; }
       public List<int> Ei;
       public int n;
       public int Count
       {
           get
           {
               return Ei.Count;
              //下面對應這題目中實驗出現k個連續正面的機率,注意多個Ei再一次實驗中同事出現
              //也算1次出現
              // return Ei.Count>0? 1: 0; 
           }
       }
       public ParserInfo()
       {
           Ei = new List<int>();
       }
       public override string ToString()
       {
           var sb = new StringBuilder();
           sb.Append("TrialId:" + TrialId +"----");
           foreach (var i in Ei)
           {
               sb.Append("E" + i+",");
           }
          return sb.ToString().Trim(",".ToCharArray());
       }
   }
   public class PoissonParser
   {


       public PoissonParser()
       {
           
       }
       public ParserInfo Do(string serial, int trialId, int k)
       {
           var info = new ParserInfo();

           info.TrialId = trialId;
           info.n=serial.Length-1;     
           var queue=new Queue<int>();
           for (int i = 0; i < serial.Length; i++)
           {
               var c = serial[i];
               if (c == 'H')
               {
                   if (queue.Count == k)
                   {
                       queue.Dequeue();
                   }
                   queue.Enqueue(i);
                  
               }
               else if (c == 'T')
               {
                   if (queue.Count == k)
                   {
                       info.Ei.Add(queue.Dequeue()+1);
                   }
                   queue.Clear();
               }

               
           }
           return info;
       }
   }
}
View Code

 

題目只要求出現HH這樣的字符序列那麼此次實驗(n個投擲算一個實驗)就算出現了,至於HHHHT,HHHHT,HHTHH,都是而且記1次,ide

而後跟總的實驗次數相除獲得機率,好比記了x次,總的有y*n 那麼就是x/yui

全部題目的實際機率是求P(Ln>=k)出現的機率spa

 

拿n=5,k=2來講,下面圖片列出32種可能,而出現HH片斷有19次,HHTHH咱們統計時按一次來,全部E1 交 E4是不爲空的。HHTHH出現3d

表示E1,E4同時發生了。code

 

根據第9版p20也定義,無不相容事件,若是 EF=空 那麼E與F互不相容 ,另外P(空)=0orm

明顯當k,n選擇適當參數時咱們會發現Ei Ej 有不爲空的狀況blog

考慮k=2,n=5的狀況,Ei定義參考課文事件

那麼一次實驗中HHTHH 的序列就是E1與E4同時出現了圖片

clc
syms r
format long
n=5;
k=2;
p=1/2;
s=0;
for r=1: n-k+1
    c1=0;
    if n-r*k >= r
       c1=nchoosek((n-r*k),r);
    end
    c2=0;
    if(n-r*k >= r-1)
       c2=nchoosek(n-r*k,r-1); 
    end
    s=s + (-1)^(r+1) *( c1  +  (1/p)*c2 )  * p^(k*r)*(1-p)^r;
end
View Code

 

書上的實驗指的是flips, 一次實驗(n次投擲)的結果,因爲Ei 嗯 Ej 可能同時出現,全部他們不是互不相容的

4b能夠這樣描述,E表示第一枚正面朝上,F表示第二枚正面操做, 如今求A有一枚正面朝上的機率。這樣描述就跟上面的遊程

同樣。即P(A)=P(E 並 F)。 而且一次實驗中E,F可能同時出現。

有4種狀況 HH,HT,TH,TT,   P(A)=3/4,  P(E)=1/2  P(F)=1/2  ,  P(EF)=1/4 ,按公式(2.4節命題4.4)  ,1/2 +1/2 -1/4=3/4;

相關文章
相關標籤/搜索