コラム / パイパイモンテカルロたん / 11



いったん前回のつなげてきたソースをまとめて確認
    //値を集める
   Goma:=StrToInt(AllGoma.Caption);
   Erai:=StrToInt(EraiGoma.Caption);

   //ゴマをかける
   NewX:=Random(258);
   NewY:=Random(258);
   Image1.Canvas.Pixels[NewX,NewY]:=clRed;

   //値を更新
   Distance:=sqrt(sqr(NewX-128)+sqr(NewY-128));
   if Distance<=128 then begin
       Erai:=Erai+1;
   end;
   Goma:=Goma+1;

   //計算
   Pai:=4*Erai/Goma;

   //値を反映させる
   AllGoma.Caption:=IntToStr(Goma);
   EraiGoma.Caption:=IntToStr(Erai);
   Oppai.Caption:=CurrToStr(Pai);
大丈夫だったら、ボタンクリックのイベントを編集します。
とりあえず、■で塗りつぶす部分を
       //塗りつぶす
       FillRect(Rect(0,0,257,257));
と直して置いてください。
TImageの幅、257ですから、ピクセルは、0番から256番 だということを、
忘れてました。
あっ あと
   //ゴマをかける
   NewX:=Random(258);
   NewY:=Random(258);
   Image1.Canvas.Pixels[NewX,NewY]:=clRed;
も、
   //ゴマをかける
   NewX:=Random(257);
   NewY:=Random(257);
   Image1.Canvas.Pixels[NewX,NewY]:=clRed;
にしてくださいー あぶないあぶない
そしたら、
    with Image1.Canvas do begin
       //ペンの設定
       Pen.Style:=psSolid;
       Pen.Mode:=pmCopy;
       Pen.Color:=clBlack;
       //ブラシの設定
       Brush.Style:=bsSolid;
       Brush.Color:=clWhite;
       //塗りつぶす
       FillRect(Rect(0,0,257,257));
       //○を描く
       Ellipse(Rect(0,0,257,257));
   end;
   AllGoma.Caption:='0';
   EraiGoma.Caption:='0';
   Oppai.Caption:='0';
   Timer1.Enabled:=True;
   Randomize;
と、ボタンのイベントの後ろに追加です。
上3行は大丈夫ですね。
文字列の0です。
Timer1.Enabledは、タイマーの
動いている プロパティです。
真ならタイマーが動いていて、onTimerが定期的に呼ばれます。
偽なら動きません。
最初の設定は偽になってますから、
Trueを代入して真にします。
Randomize;というのは、
Random の値をランダムにする命令です。
え?ランダムじゃないのか って?
実は コンピューターの中には、
「適当な値を出す回路」 なんてもんは無いんです。
だから、「超正確に適当な計算をする」ことで乱数
とほざいてます。
で、その「適当な計算」の結果を覚えておいて、それをまた
「適当な計算」に使うことで、
適当→適当の適当→適当の適当の適当
って感じで乱数をぽりぽり出していくわけです。
Randomize;を呼び出すと、
その「一番最初の適当」を、パソコンの
「時計」を元に設定してくれます。
時計ならいつでも違う値だから、
最初の適当が変えられるってわけです。
これを呼び出さないと、
最初の適当な値がいつも同じなので、
やるたびに同じ乱数がほいほい出てきちゃうわけですな。
ちなみに、「最初の適当」を「乱数の種」って言います。
まぁ、保存して完成です。
実行してみてください。
・・・・・でもまだ続くよ