Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Chance-Funktion (https://www.delphipraxis.net/157473-chance-funktion.html)

Flips 12. Jan 2011 21:50

Chance-Funktion
 
Hi.

Ich benötige eine Funktion, welcher ich als Parameter eine Chance/Wahrscheinlichkeit mitgebe. Diese Funktion soll mir dann mit gegebener Wahrscheinlichkeit true zurückgeben.
Delphi-Quellcode:
function GetChance(Chance: Single):boolean;
var number : Integer;
begin
if chance = 0 then
  result := false
else
  begin
      number := random(100)+1;
      result := number <= trunc(Chance*100);
  end;
end;
Natürlich kann die Wahrscheinlichkeit hier nur zwischen 0.00 und 1.00 liegen.
Ist der Code in diesem Fall richtig? Oder kennt evtl. jemand eine allgemeinere Funktion, die evtl. auf unbegrenzte Genauigkeit ausgelegt ist?

Danke!

himitsu 12. Jan 2011 21:58

AW: Chance-Funktion
 
Das
Delphi-Quellcode:
if chance = 0
und
Delphi-Quellcode:
+1
in deinen Code kannst'e wegkürzen, wenn du statt
Delphi-Quellcode:
<=
einfach nur
Delphi-Quellcode:
<
verwendest.

Delphi-Quellcode:
function GetChance(Chance: Single): Boolean;
begin
  Result := Random(100) < Trunc(Chance * 100); // oder doch besser Round
end;
PS: Random ohne Parameter gibt einen Wert im Bereich
Delphi-Quellcode:
0.0 <= x < 1.0
zurück, welches doch perfekt zu den Werten deines Chance paßt.
Delphi-Quellcode:
function GetChance(Chance: Single): Boolean;
begin
  Result := Random < Chance;
end;

Flips 12. Jan 2011 22:05

AW: Chance-Funktion
 
Genial, so habe ich Random bisher nie genutzt. Immer nur mit Parameter, ich dachte immer random ohne Parameter liefert entweder 0 oder 1.
Dankeschön, das hat mir sehr geholfen!

himitsu 12. Jan 2011 22:09

AW: Chance-Funktion
 
Nicht böse gemeint.
Zitat:

Zitat von Flips (Beitrag 1074347)
ich dachte immer random ohne Parameter liefert entweder 0 oder 1.

Aber manchmal weniger denken und dafür nachsehn.
Delphi-Referenz durchsuchenRandom
Aber OK,
Delphi-Quellcode:
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
Delphi-Quellcode:
0.0 <= X < 1.0
, also
Delphi-Quellcode:
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:
Delphi-Quellcode:
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;

Flips 12. Jan 2011 22:14

AW: Chance-Funktion
 
Ich formuliere neu:
Ich war davon überzeugt, random gibt entweder 0 oder 1 aus.
Deshalb gab es für mich auch keinen Grund, mir die Random-Methode nochmal anzuschauen, in meinem ursprünglichen Code hat es ja geklappt ;-)

himitsu 12. Jan 2011 22:22

AW: Chance-Funktion
 
Nee nee, ganz geklappt hatte dein ursprünglicher Code nicht.
Das Ergebnis ist um 0.01 (also die 1) zu groß. (außer bei 0)

Siehe das PS meiner letzten Antwort, wenn man es mal nachmist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz