• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            voip
            風的方向
            厚德致遠,博學敦行!
            posts - 52,comments - 21,trackbacks - 0
                        學以致用!!!
                        隨機數可以用來計算概率,面積等?。?br>         一、隨機數,模擬拋硬幣正面時間頻率圖。
                     代碼如下:
            #include<iostream>
            #include
            <time.h>
            using namespace std;
            const unsigned long maxshort=65536L;
            const unsigned long multiplier=1194211693L;
            const unsigned long adder=12345L;

            class RandomNumber
            {
            private:
                unsigned 
            long randSeed;                    //隨機種子
            public:
                RandomNumber(unsigned 
            long s=0);            //構造函數,為randSeed置數
                unsigned short Random(unsigned long n);        //獲取0~n的一個隨機數
                double fRandom(void);                        //獲取一個小數
            }
            ;

            RandomNumber::RandomNumber(unsigned 
            long s)        
            {
                
            if(s==0
                    randSeed
            =time(0);                        //這里獲取直接用time函數獲取了一個時間值當做種子了,沒有再用srand函數構造種子了!網上查了下time()函數為從1970年1月1日0時0分0秒到此時的秒數?。?!
                else
                    randSeed
            =s;                    
            }


            unsigned 
            short RandomNumber::Random(unsigned long n)
            {
            //    printf("randSeed:%lu \nmultiplier:%lu  \nrandSeed*multiplier:%lu\n",randSeed,multiplier,randSeed*multiplier);
                randSeed=multiplier*randSeed+adder;            //這里存在一個越界問題,但是還是會從新獲得一個randSeed
            //    printf("(randSeed>>16):%lu\n",randSeed>>16);
                return (unsigned short)((randSeed>>16)%n);        //右移16為再與n取余,從而獲得一個0~n的隨機數,其實我還不明白,為啥還要右移呢?難道是為了隨機性?
            }


            double RandomNumber::fRandom(void)
            {
                
            return Random(maxshort)/double(maxshort);     
            }


            int TossCoins(int numberCoins)
            {
                
            static RandomNumber coinToss;        //注意了這里定義了一個靜態變量,在函數反復調用中coinToss的屬性值不變,從構造函數的角度來理解,在函數反復調用過程中,該對象是不會重新去構造的(不會重復調用構造函數的)!
                int i,tosses=0;
                
            for(i=0;i<numberCoins;i++)            //這里調用Random函數!!
                {
                    tosses
            +=coinToss.Random(2);        //返回0或1,1表示正面,0表示反面,累計正面朝上的次數
                }

                
            return tosses;                        //返回正面朝上的次數
            }

            void main()
            {
                
            const int NCOINS=10;                //定義了常量,我從一些牛人哪里看到,我們應該把靜態變量看成只讀。。。
                const long NTOSSES=50000L;        
                
            long i,heads[NCOINS+1];                //h[i]代表NTOSSES次拋NCOINS次拋硬幣中i次正面次數,貌似有些拗口,按這個實例來說,應該是做50000次拋10次硬幣,然后統計10次中出現0次正面朝上次數,1次正面朝上次數,。。10次正面朝上次數
                int j,position;

                
            for(j=0;j<NCOINS+1;j++)
                    heads[j]
            =0;

                
            for(i=0;i<NTOSSES;i++)                //累計
                    heads[TossCoins(NCOINS)]++;

                cout
            <<"head結果:";
                
            for(i=0;i<=NCOINS;i++)                //輸出h結果
                {
                    cout
            <<heads[i]<<" ";
                }


                cout
            <<endl;

                
            for(i=0;i<=NCOINS;i++)            //模擬拋硬幣正面事件平率圖
                {
                    position
            =int (float(heads[i])/NTOSSES*100);//這里有強制類型轉換,其實這里計算了概率,通過強制類型轉換成整數!!!
                    cout<<i<<" ";

                    
            for(j=0;j<position-1;j++)            //輸出空格
                        cout<<" ";
                    cout
            <<"*"<<endl;
                }

            }

            運行結果如下:
             
                     二、隨機數,計算∏?;舅枷胍彩沁\用了概率事件!設有一個半徑為r的圓及其外切四邊形,向該圖形投擲N個點。設落入圓內的點數為K,由于投入的點在正方形上分布均勻,所以落入圓中的概率為∏*R^2/4/R^2,從投點的角度考慮,該概率為K/N,當N足夠大時,我們可以近似的認為二者相等。從而∏=4*K/N。
            代碼如下:
            double Darts(int n)
            {
                
            static RandomNumber dart;
                
            int k=0;
                
            for(int i=1;i<=n;i++)
                
            {
                    
            double  x=dart.fRandom();
                    
            double  y=dart.fRandom();
                    
            if((x*x+y*y)<=1)
                        k
            ++;
                }

                
            return 4*k/double(n);
            }

            當n=500000000時,運行結果如下:
             

            printf輸出:http://hi.baidu.com/jiaju111/blog/item/dcd7fd8ba9a7fa1ac9fc7ae2.html

            C語言時間日期函數說明:http://www.cnblogs.com/neonlight/archive/2008/08/22/1273942.html
            posted on 2010-09-13 15:51 jince 閱讀(640) 評論(0)  編輯 收藏 引用 所屬分類: 算法設計與分析
            哈哈哈哈哈哈
            久久天天躁狠狠躁夜夜不卡| 久久久久久久99精品免费观看| 亚洲国产成人久久笫一页| 嫩草影院久久国产精品| 色偷偷88欧美精品久久久| 久久99热这里只有精品66| 国内精品人妻无码久久久影院| 精品无码久久久久久国产| 欧美久久天天综合香蕉伊| 久久婷婷国产综合精品| 久久久久亚洲精品男人的天堂| 亚洲色婷婷综合久久| 一本一道久久精品综合| 亚洲AV日韩精品久久久久久久| 9999国产精品欧美久久久久久 | 熟妇人妻久久中文字幕| 91精品国产91热久久久久福利| 99久久精品免费看国产一区二区三区 | 91麻豆国产精品91久久久| 久久―日本道色综合久久| 7777精品伊人久久久大香线蕉| 91久久九九无码成人网站| 人妻少妇久久中文字幕| 久久无码精品一区二区三区| 久久精品国产亚洲麻豆| 97精品伊人久久大香线蕉| 国产精品成人无码久久久久久| 色欲久久久天天天综合网精品| 精品久久久一二三区| 久久这里有精品视频| 国产亚洲精午夜久久久久久| 久久国产精品久久精品国产| 亚洲AV无码久久精品色欲| 亚洲伊人久久成综合人影院| 久久夜色精品国产| 欧美成a人片免费看久久| 国内精品欧美久久精品| 99久久99久久精品国产片果冻| 丁香五月综合久久激情| 青青草国产精品久久久久| 91久久九九无码成人网站|