AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Chance-Funktion

Ein Thema von Flips · begonnen am 12. Jan 2011 · letzter Beitrag vom 12. Jan 2011
Antwort Antwort
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#1

Chance-Funktion

  Alt 12. Jan 2011, 20:50
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!
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Chance-Funktion

  Alt 12. Jan 2011, 20:58
Das if chance = 0 und +1 in deinen Code kannst'e wegkürzen, wenn du statt <= einfach nur < 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 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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#3

AW: Chance-Funktion

  Alt 12. Jan 2011, 21:05
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!
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Chance-Funktion

  Alt 12. Jan 2011, 21: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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#5

AW: Chance-Funktion

  Alt 12. Jan 2011, 21:14
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
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Chance-Funktion

  Alt 12. Jan 2011, 21:22
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz