Nicht böse gemeint.
ich dachte immer random ohne Parameter liefert entweder 0 oder 1.
Aber manchmal weniger denken und dafür nachsehn.
Random
Aber OK,
0 <= X < 1
könnte man schon mißverstehen, aber wenn man sieht, das das Eine Integer und das andere Double ist, dann könnte man eventuell auf die Idee kommen, daß es eher
0.0 <= X < 1.0
, also
0.0 bis 0.9999...
bedeutet.
Ach ja, probier es auch einfach mal aus?
2x TLabel (am Besten untereinander angeordnet)
1x TButton
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
const
x: Double = 0.5; // oder 0.5 oder 1
begin
while not Application.Terminated do
begin
if GetChance(x) then
Label1.Caption := IntToStr(StrToIntDef(Label1.Caption, 0) + 1)
else
Label2.Caption := IntToStr(StrToIntDef(Label2.Caption, 0) + 1);
Application.ProcessMessages;
end;
end;
0.0 = nur in Label2 wird hochgezählt
0.1 = Label2 ist etwa 10 Mal größer als Label1
0.5 = in Label1 und Label2 wird gleichmäßig hochgezählt
1.0 = nur in Label1 wird hochgezählt
PS: Mit Chance = 0.01 müßte die Funktion eigentlich 99:1 liefern, aber deine ursprüngliche Funktion liefert 100:0
[add]
Um den gemessenen Wert anzuzeigen:
Label3.Caption := FloatToStr(StrToIntDef(Label1.Caption, 0) / (StrToIntDef(Label1.Caption, 0) + StrToIntDef(Label2.Caption, 0)));
[edit]
Rechenfehler behoben, bei Label3
und hier noch etwas schneller
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
const
x: Double = 0.02; // oder 0.5 oder 1
var
c1, c2, z: Integer;
c: Double;
begin
c1 := 0;
c2 := 0;
while not Application.Terminated do
begin
for z := 999 downto 0 do
if GetChance(x) then Inc(c1) else Inc(c2);
Label1.Caption := IntToStr(c1);
Label2.Caption := IntToStr(c2);
Label3.Caption := FloatToStr(c1 / (c1 + c2));
Application.ProcessMessages;
end;
end;