Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zufall: Mit Wahrscheinlichkeit 1:x generieren (https://www.delphipraxis.net/48774-zufall-mit-wahrscheinlichkeit-1-x-generieren.html)

yankee 30. Jun 2005 05:57


Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Eigentlich will ich das in PHP machen, aber Delphicode würde mir genauso weiterhelfen, schließlich geht es ums prinzip und nicht um die Syntax. Sry, ich komme einfach nicht drauf.
Ich habe in einer variable x eine float-Zahl. Jetzt will ich einen Boolean-Zufall generieren und zwar so, dass je höher meine Zahl ist, je höher ist die Wahrscheinlichkeit true raus zu bekommen.
Also nach dem Prinzip, dass die Wahrscheinlichkeit true zu bekommen 1:x ist.
Wie mache ich das?

marabu 30. Jun 2005 06:10

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Delphi-Quellcode:
function Odds(x: double): boolean;
begin
  Result := Random < Frac(x);
end;
Grüße vom marabu

yankee 30. Jun 2005 06:19

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
@marabu:
Das würde doch dazu führen, dass sich der Wert nur zwischen 0 und 1 bewegen darf (bzw. dass wenn der Wert größer als 1, dann kommt immer true raus.
Aber wenn der wert 1 ist, soll es ja 1:1 sein, als 50% Wahrscheinlichkeit. Und 1:2 oben doppelt so wahrscheinlich, dass true rasukommt, als das false rauskommt...

marabu 30. Jun 2005 06:25

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Hast Recht - ich hatte bei Float bereits Frac() unterstellt und - na ja - so geht es dann besser:

Delphi-Quellcode:
function Odds(x: double): boolean;
begin
  Result := Random > (1 / x);
end;
marabu

Dritter Anlauf: Langsam werde ich munter. Deine Anforderung widerspricht sich irgendwie.

Zitat:

Zitat von yankee
Jetzt will ich einen Boolean-Zufall generieren und zwar so, dass je höher meine Zahl ist, je höher ist die Wahrscheinlichkeit true raus zu bekommen.

Diese Anforderung erfüllt der obige Code.

Eine Wahrscheinlichkeit 1:x erhältst du aber so:

Delphi-Quellcode:
function Odds(x: double): boolean;
begin
  Result := (Random * (1 + x)) < 1;
end;
marabu

yankee 30. Jun 2005 19:32

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Zitat:

Zitat von marabu
Delphi-Quellcode:
function Odds(x: double): boolean;
begin
  Result := (Random * (1 + x)) < 1;
end;
marabu

Danke, dass funzt. :thumb:

glkgereon 30. Okt 2005 08:13

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
ich hab grad den thread zufällig gefunden.

wäre folgendes nicht viel intuitiver?

Delphi-Quellcode:
function Wahrscheinlichkeit(W: Integer):Boolean;
begin
  Result:=not (Random(W+1)=0);
end;

Jelly 30. Okt 2005 10:47

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was hier allgemein erreicht werden will, ist aus einer Verteilungsfunktion einen Random Wert zu erhalten, der bei genügend vielen Werten die Verteilungsfunktion beliebig genau abdeckt. Da Ganze fällt unter den Begriff "Monte Carlo Simulation2. Ich hab hier mal ein Kapitel aus meiner Diplomarbeit angehängt, das hoffentlich das Prinzip erklärt. Interessant ist dabei nur Abschnitt 1.1.

Jelly 30. Okt 2005 23:01

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Zitat:

Zitat von yankee
Ich habe in einer variable x eine float-Zahl. Jetzt will ich einen Boolean-Zufall generieren und zwar so, dass je höher meine Zahl ist, je höher ist die Wahrscheinlichkeit true raus zu bekommen.
Also nach dem Prinzip, dass die Wahrscheinlichkeit true zu bekommen 1:x ist.

Auch wenn der Thread schon etwas älter ist, was ich vorhin nicht bemerkt habe, versteh ich deine Aussage nicht. Mit x wachsend heisst 1/x ist fallend.

Dir fehlt hier definitiv eine Aussage, ab wann deine Zahl gross ist.

Die von Marabu gezeigte Lösung mag wohl zustimmen, aber wer mal mein Kapitel über Monte Carlo durchgelesen hat, kommt zu folgendem Ergebnis, mit xi eine Zufallszahl zwischen 0..1:

Code:
xi = Integral[0..x] (1/x dx)
   = ln x

=> x = e^xi
Ich bin etwas verwirrt, was die Anfangsfragestellung angeht. Aber vielleicht kann das ja nochmals genauer dargestellt werden.

yankee 30. Okt 2005 23:41

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
@Jelly: Naja, also wie ich schon geschrieben habe, hat sich das Problem an sich eigentlich längst erledigt. Der Thread ist nicht nur ein bißchen älter, sondern schon etwa 5 Monate alt. Ich kann mich zwar noch daran erinnern, dass Problem gehabt zu haben, aber nichtmehr so ganz genau in welchem Zusammenhang.
Wenn wir das hier also noch weiter diskutieren, dann nur noch für andere, die mal das gleiche Problem haben und einfach so wegen dem Prinzip.
Aber gut, dann mal los: Ich glaube du hast das Problem trotzdem etwas missverstanden. Es geht nämlich darum einen boolean-Wert zu generieren. Also wie zum Beispiel bei einem Kartenspiel mit 3 Karten, wo du die richtige ziehen musst. Es interessiert in diesem Fall jetzt mla nicht wie hoch die Wahrscheinlichkeit ist, dass ich die richtige Karte ziehe, sondern ich ziehe einfach und es war richtig oder nicht. Und e^xi ist jedenfalls kein Boolean.

@glkgereon:
Nein, das geht nicht. Random ohne Parameter liefert dir eine Zahl (float) zwischen 0 und 1 und mit Paremeter einen Integer. Alleridngs musst du soweit ich weiß Random, wenn du ihm schon etwas übergibst einen Integer übergeben.
Zitat:

Zitat von yankee
Ich habe in einer variable x eine float-Zahl.

Hilft also nicht.

Jelly 31. Okt 2005 09:39

Re: Zufall: Mit Wahrscheinlichkeit 1:x generieren
 
Ich glaub jetzt hab ich das Problem verstanden. Ich hatte in de Vergangenheit wohl zu viel mit "Monte Carlo" zu tun, und meine alles was mit Wahrscheinlichkeiten zu tun hat, hat zwangsläufig was mit Monte Carlo zu tun.

Aber die Lösung wurde demnach ja dann schon geschrieben und muss jetzt nicht wieder neu aufgerollt werden. Danke aber für detaillierte Schilderung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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