papirus3

Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Может здесь помогут. Необходимо написать генератор случайный чисел работающий по нормальному распределению. Алоритм написан необходимо построить график и вывести таблицу вероятность переода из каждой точки в любую. Проблема заключается в том что вероятность в центре фигуры по таблице идёт реальная уменьшаясь к краям. Но на последних значениях вместо того что-бы обратиться практически в 0 наблюдается необьяснимый всплеск. Причём чем больше количество опытов тем результат на концах более бредовый. В чём может быть проблема. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, ComCtrls, Grids,math; type TForm1 = class(TForm) Chart1: TChart; Button1: TButton; LECount: TLabeledEdit; LEDis: TLabeledEdit; PB: TProgressBar; Label1: TLabel; SG: TStringGrid; LEMat: TLabeledEdit; Series1: TAreaSeries; procedure Button1Click(Sender: TObject); private procedure GrdClear; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.GrdClear; //Ïðîöåäóðà î÷èñòêè var i,j:byte; begin SG.Cols[0].Clear; for i:=1 to 30 do begin SG.Cols[i].Clear; SG.Cells[0,i]:=inttostr(i); SG.Cells[i,0]:=inttostr(i); end; end; procedure TForm1.Button1Click(Sender: TObject); var i,j,k,l,colcount,mat:integer; count: array [-100 .. 100]of longint; cnt:array[-34..34,-34..34] of longint; cnt2:array[-34..34] of longint; dis,znach,znachp:real; numcount,min:longint; U : Double; V : Double; S : Double; Sum : Double; begin Button1.Caption:='Ãåíåðèðóåòñÿ ...'; Button1.Enabled:=false; Button1.Repaint; PB.Position:=0; PB.Max:=0; PB.Min:=0; colcount:=strtoint(LECount.Text); dis:=strtofloat(LEDis.Text); mat:=strtoint(LEMat.Text); Chart1.Series[0].Clear; PB.Max:=colcount; for i:=-34 to 34 do cnt2[i]:=1; for i:=-34 to 34 do for j:= -34 to 34 do cnt[i,j]:=0; for i:=-100 to 100 do count[i]:=0; znachp:=1; for i:=0 to colcount-1 do begin sum:=2; repeat u := (2*floor( Random(2))-1)*Random; v := (2*floor(Random(2))-1)*Random; sum := u*u+v*v; until (sum<1) and (sum>0); sum := sqrt(-2*ln(sum)/sum); znach := dis*u*sum+mat; if (znach>-99) and (znach <99) then begin count[round(znach)]:=count[round(znach)]+1; k:=round(znachp); if k<-99 then k:=-99; if k>99 then k:=99; k:=k div 3; l:=round(znach); if l<-99 then l:=-99; if l>99 then l:=99; l:=l div 3; cnt[k,l]:=cnt[k,l]+1; cnt2[l]:=cnt2[l]+1; znachp:=znach; end; if (i /(colcount div 100))=(i div (colcount div 100)) then PB.Position:=i; end; //Ñòðîèì ãðàôèê for i:=-99 to 99 do begin if(count[i]>0) then Chart1.Series[0].AddXY(i,count[i]); end; numcount:=0; min:=-500; for i:=-33 to 33 do if cnt2[i]>1 then begin numcount:=numcount+1; if min=-500 then min:=i; end; //Ãðàíèöû äëÿ òàáëèöû SG.ColCount:=numcount+2; SG.RowCount:=numcount+2; //Íóìåðóåì òàáëèöó for i:=min to min+numcount do begin SG.Cells[0,i-min+1]:=inttostr(i); SG.Cells[i-min+1,0]:=inttostr(i); end; //Çàïîëíÿåì òàáëèöó for i:=min to min+numcount do for j:=min to min+numcount do if cnt2[j]<>1 then SG.Cells[i-min+1,j-min+1]:=floattostr(cnt[j,i]/(cnt2[j]-1)*100); //Çàïîëíÿåì ÿ÷åéêè PB.Position:=colcount; Button1.Caption:='Ãåíåðèðîâàòü'; Button1.Enabled:=true; end; end. Русский текст здесь был несущественнен. http://up.li.ru/files/2005/04/19/53787.JPG;ACDSee+7.0+BMP+Image.JPG |