高爾頓釘板概率模型的實現

        高爾頓釘板是一個關於概率的模型,小球每次下落,將隨機的向兩邊等概率的下落,當有大量的小球都滾下時,最終在釘板下面不同位置收集到的小球數量,將符合二項分佈概率。

       出於興趣,在VC編譯環境下,通過C++語言,模擬實現了高爾頓釘板的概率模型。本程序中定義了兩個類,Ball和Holder類,Ball 是定義的小球類,Holder是定義的釘板類。Holder類主要負責畫圖顯現模板框架,以及當一個小球滾到釘板下面容器位置,將小球放在合適的位置,並且當整個容器滿的時候,即停止程序運行。小球類,定義了小球所處位置,並對小球進行作圖。另外定義了根據傳入的參數的移動規則,即,向左或者向右移動。另外定義了一個control函數,來控制holder和Ball類對象之間的交互,並且達到動態效果

                                  圖1   高爾頓釘板模型       

                             圖 2 程序運行圖1                                                                          圖3 程序運行圖2


源代碼:

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include "iostream"


class Ball
{
public:
Ball()
{
x=300;
y=40;
flag=1;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
int getFlag()
{
return flag;
}
int move(int i);
void fixed(int y1);
void draw()
{
solidcircle(x,y,20);
}

private:
int x,y;
int flag;
int level;
};


class Holder
{
public:
Holder()
{
for(int i=0;i<10;i++)
for(int j=0;j<7;j++)
a[i][j]=0;
full=0;
}
void draw();
int getfull()
{
return full;
}
void steady_one(Ball &b);
private:
int a[10][7];
int full;
};
void Holder::steady_one(Ball &b)
{
int i=0,temp=0;
if(b.getFlag()==0 && full==0)
{
temp = b.getX()-50-25;
temp=temp/50;
for(i=0;i<7;i++)
{
if(a[temp][i]==0)
{
a[temp][i]=1;
b.fixed(790-i*40-20);
break;
}


}
}
for(i=0;i<10;i++)
{
if(a[i][6]==1)
{
full=1;
break;
}
}
}
void Holder::draw()
{
int i=0,j=0,tempx=100,tempy=460;
line(50,790,550,790);
for(i=0;i<11;i++)
{
line(50+i*50,470,50+i*50,790);
}
for(i=9;i>0;i--,tempx += 25,tempy -= 50)
for(j=0;j<i;j++)
{
line(tempx+j*50,tempy,tempx+j*50,tempy+10);
}
line(275,60,275,20);
line(325,60,325,20);
line(275,60,50,470);
line(325,60,550,470);
}


int Ball::move(int i)
{
if(i==0)
{
if(flag==1)
{
x -= 25;
y += 50;
if(y>470)
{
flag=0;
}
}
}
else if(i==1)
{
if(flag==1)
{
x += 25;
y += 50;
if(y>470)
flag=0;
}
}
return 0;
}
void Ball::fixed(int y1)
{
y=y1;
}
int control()
{
Holder h1;
Ball b[50];
int num=1,i=0,temp,c[50];
for(i=0;i<50;i++)
c[i]=1;
while(1)
{
for(i=0;i<num;i++)
{
if(c[i]==1)
{
if(b[i].getFlag()==1)
{
temp=rand()%2;
b[i].move(temp);
}
else
{
h1.steady_one(b[i]);
num++;
c[i]=0;
}
}
}
h1.draw();
for(i=0;i<num;i++)
b[i].draw();
if(h1.getfull()==1)
break;
Sleep(300);
cleardevice();
}
return 0;
}
int main()
{
initgraph(600, 800);
setcolor(YELLOW);
setfillcolor(YELLOW);
control();
Sleep(10000);
return 0;
}

發佈了28 篇原創文章 · 獲贊 35 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章