Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zufallszahl prozentual manipulieren (https://www.delphipraxis.net/108934-zufallszahl-prozentual-manipulieren.html)

MrKnogge 21. Feb 2008 12:58


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

guidok 21. Feb 2008 13:00

Re: Zufallszahl prozentual manipulieren
 
Gewichtete Zufallszahl

Vielleicht hilft dir das weiter, das Problem hatte ich auch.

Nikolas 21. Feb 2008 13:10

Re: Zufallszahl prozentual manipulieren
 
Ich finde diesen Ansatz am Besten:
Delphi-Quellcode:
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
Wobei ich ihn etwas ändern würde:
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...)

shmia 21. Feb 2008 13:36

Re: Zufallszahl prozentual manipulieren
 
Vielleicht so:
Delphi-Quellcode:
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;
Aufruf:
Delphi-Quellcode:
  daten := GetZufallData(ZList);

MrKnogge 22. Feb 2008 11:16

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 01:41 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