Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Chance-Funktion

  Alt 12. Jan 2011, 22:09
Nicht böse gemeint.
ich dachte immer random ohne Parameter liefert entweder 0 oder 1.
Aber manchmal weniger denken und dafür nachsehn.
Delphi-Referenz durchsuchenRandom
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;
$2B or not $2B

Geändert von himitsu (12. Jan 2011 um 23:35 Uhr)
  Mit Zitat antworten Zitat