これは Delphi Advent Calendar 5日目の記事です。
http://qiita.com/advent-calendar/2016/delphi
こないだ Togetter で "乱数にコクを出す方法について" ってのを見かけたのですよ。
http://togetter.com/li/1044668
で、これが Delphi ならどうなるのかと。まぁ元ネタのように Random() の値を何度か足し算すればいいのですが、結局の所これは正規分布なわけで、Delphi なら Math.RandG() を使えばいいわけです。コードは以下のようになります。
unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, System.Math, Vcl.ComCtrls;
type TForm1 = class(TForm) btnRandom1: TButton; PaintBox1: TPaintBox; btnRandG: TButton; btnRandom2: TButton; btnRandom3: TButton; btnRandom4: TButton; btnRandom5: TButton; Edit1: TEdit; UpDown1: TUpDown; procedure PaintBox1Paint(Sender: TObject); procedure btnRandom_Click(Sender: TObject); procedure btnRandGClick(Sender: TObject); private { Private 宣言 } v: array [0..99] of Integer; procedure InitArray; public { Public 宣言 } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.InitArray; var i: Integer; begin for i:=Low(v) to High(v) do v[i] := 0; end;
procedure TForm1.btnRandom_Click(Sender: TObject); var i, l, Idx: Integer; Loop: Integer; R: Extended; begin Loop := (Sender as TButton).Tag + 1; Randomize; InitArray; for i:=1 to 10000 do begin R := 0; for l:=1 to Loop do R := R + Random; Idx := Trunc((R) / Loop * 100); v[Idx] := v[Idx] + 1; end; PaintBox1.Invalidate; end;
procedure TForm1.btnRandGClick(Sender: TObject); var i, Idx: Integer; begin Randomize; InitArray; for i:=1 to 10000 do begin repeat Idx := Trunc(RandG(50, UpDown1.Position)); until (Idx >= Low(v)) and (Idx <= High(v)); v[Idx] := v[Idx] + 1; end; PaintBox1.Invalidate; end;
procedure TForm1.PaintBox1Paint(Sender: TObject); var i: Integer; begin with PaintBox1.Canvas do begin Brush.Color := clWhite; Pen.Color := clblue; FillRect(PaintBox1.ClientRect); MoveTo(0, PaintBox1.ClientHeight - v[0]); for i:=Low(v)+1 to High(v) do LineTo(i * 4, PaintBox1.ClientHeight - v[i]); end; end;
end.
実行結果がコレです。
RandG() は昔からありますが、最近の Delphi だと System 名前空間にイロイロと便利なのが増えています。今度のデベロッパーキャンプでは関連する話をやりたいと思っています…個別にそれを紹介する訳ではないですけどね。需要があるのかどうか知りませんが、一応ソースコードも置いておきますね。
Download: http://ht-deko.com/software/koku_random.zip
この記事の内容は以前 Facebook で書いたものなのですが、ソースコードを公開していなかったのでアドベントカレンダーの記事に転用しました。何故仮タイトルが "月曜日のはわわ" だったのかと言うと、デブキャンの資料がまだできていないからです…はわわ > <
|