AGB  ·  Datenschutz  ·  Impressum  







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

Zufallszahl prozentual manipulieren

Ein Thema von MrKnogge · begonnen am 21. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#1

Zufallszahl prozentual manipulieren

  Alt 21. Feb 2008, 12:58
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
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#2

Re: Zufallszahl prozentual manipulieren

  Alt 21. Feb 2008, 13:00
Gewichtete Zufallszahl

Vielleicht hilft dir das weiter, das Problem hatte ich auch.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Zufallszahl prozentual manipulieren

  Alt 21. Feb 2008, 13:10
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...)
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Zufallszahl prozentual manipulieren

  Alt 21. Feb 2008, 13:36
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:
  daten := GetZufallData(ZList);
Andreas
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Zufallszahl prozentual manipulieren

  Alt 22. Feb 2008, 11:16
Danke, ich habe es nun mit der Monte-Carlo-Simulation aus obigem Link gelöst.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  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 01:15 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