![]() |
Zufallszahl prozentual manipulieren
Moin,
sorry, ein anderer Titel ist mir nicht eingefallen. Mein Problem ist folgendes: Ich habe eine dynamische Anzahl an Werten (beispielsweise 5 Stück) nun wähle ich per random welchen der 5 Werte ich benutze. Soweit noch alles ok. Nun würde ich aber gerne einfluss auf die Wahrscheinlichkeit nehmen z.B. die ersten 4 Werte haben eine Wahrscheinlichkeit von 10%, der 5. Wert hingegen von 60%. Mein erster Gedanke war, einfach ein Array zu erstellen, in denen die ersten Werte je einmal vorkommen und der 5. dann eben 6 mal. Gibt es da eine elegantere Möglichkeit ? Grüße Christian |
Re: Zufallszahl prozentual manipulieren
|
Re: Zufallszahl prozentual manipulieren
Ich finde diesen Ansatz am Besten:
Delphi-Quellcode:
Wobei ich ihn etwas ändern würde:
x:=Random(2000);
if x < 20 then Level:=5 else //0..19, kommt sicher recht selten vor if x < 100 then Level:=4 else //20..99, kann schon etwas öfter passieren if x < 300 then Level:=3 else //100..299, noch öfter if x < 800 then Level:=2 else //300..799, schon relativ großer Bereich Level:=1; //800 .. 1999, größter Bereich, hier wirds wohl die meisten Treffer geben Du nimmst ein Array und schreibst da die Bereiche rein, für eine Gleichverteilung also [1,2,3,4,5]. Dann kannst du daüber eine Schleife laufen lassen und schauen, ob ein Zufallswert aus (1,6) über dem betrachtetetn Wert liegt. Sobald das der Fall ist kannst du abbrechen. Wenn du einmal wirklich viele Bereiche hast, könntest du noch ein Art Binäre Suche machen. Also erstmal schauen, ob das Element in der Mitte über dem Zufallswert liegt und dann nur noch die entsprechende Hälfte der Gesamtliste anschauen, dass du dann on O(log n) das Ganze machen kannst. (wobei das für 5 Element noch nicht so notwendig ist...) |
Re: Zufallszahl prozentual manipulieren
Vielleicht so:
Delphi-Quellcode:
Aufruf:
type
TZEntry = record z:double; // Prozentanteil value:string; // Wert end; const // Achtung: die Summe der Prozentwerte muss 100% ergeben // die Prozentwerte sollen in absteigender Reihenfolge sortiert sein ZList :array[0..3] of TZEntry = ( (z:45.0; value:'VW'), (z:40.0; value:'Opel'), (z:10.0; value:'BMW'), (z:5.0; value:'Porsche') ); function GetZufalldata(list : array of TZEntry):string; var i : Integer; z, b : Double; begin z := random * 100.0; b := 0.0; for i := low(list) to high(list) do begin b := b + list[i].z; if z < b then begin Result := list[i].value; Exit; end; end; Result := 'invalid'; end;
Delphi-Quellcode:
daten := GetZufallData(ZList);
|
Re: Zufallszahl prozentual manipulieren
Danke, ich habe es nun mit der Monte-Carlo-Simulation aus obigem Link gelöst.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 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-2025 by Thomas Breitkreuz