![]() |
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:
Natürlich kann die Wahrscheinlichkeit hier nur zwischen 0.00 und 1.00 liegen.
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; Ist der Code in diesem Fall richtig? Oder kennt evtl. jemand eine allgemeinere Funktion, die evtl. auf unbegrenzte Genauigkeit ausgelegt ist? Danke! |
AW: Chance-Funktion
Das
Delphi-Quellcode:
und
if chance = 0
Delphi-Quellcode:
in deinen Code kannst'e wegkürzen, wenn du statt
+1
Delphi-Quellcode:
einfach nur
<=
Delphi-Quellcode:
verwendest.
<
Delphi-Quellcode:
PS: Random ohne Parameter gibt einen Wert im Bereich
function GetChance(Chance: Single): Boolean;
begin Result := Random(100) < Trunc(Chance * 100); // oder doch besser Round end;
Delphi-Quellcode:
zurück, welches doch perfekt zu den Werten deines Chance paßt.
0.0 <= x < 1.0
Delphi-Quellcode:
function GetChance(Chance: Single): Boolean;
begin Result := Random < Chance; end; |
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! |
AW: Chance-Funktion
Nicht böse gemeint.
Zitat:
![]() Aber OK,
Delphi-Quellcode:
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 <= X < 1
Delphi-Quellcode:
, also
0.0 <= X < 1.0
Delphi-Quellcode:
bedeutet.
0.0 bis 0.9999...
Ach ja, probier es auch einfach mal aus? 2x TLabel (am Besten untereinander angeordnet) 1x TButton
Delphi-Quellcode:
0.0 = nur in Label2 wird hochgezählt
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.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:
[edit]
Label3.Caption := FloatToStr(StrToIntDef(Label1.Caption, 0) / (StrToIntDef(Label1.Caption, 0) + StrToIntDef(Label2.Caption, 0)));
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; |
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 ;-) |
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