![]() |
Gewichteter Zufall
Liste der Anhänge anzeigen (Anzahl: 2)
Es gibt einen neuen Artikel auf meiner Homepage zum gewichteten Zufall:
![]() Zitat:
|
Re: Gewichteter Zufall
Hallo Luckie,
ich wäre es über mehrfaches Random angegangen: - Liste mit 30 Schülern - X := Anzahl Schüler; - N := 2; - for I := 1 to N do X := Random(X) - Treffer := Schüler(X) - Treffer an das Ende de Liste Je höher N ist um so frühere Treffer sind zu erwarten. stahli PS. Mathe ist mir zu kompliziert :? |
Re: Gewichteter Zufall
Bei dieser Idee hängt aber das Ergebnis von der Initalisierung der Liste ab.
In der Aufgabenstellung wird aber verlangt, dass nur derjenige, der als letzter geantwortet hat, eine kleinere Wahrscheinlichkeit hat als alle anderen. Das ist somit nicht gegeben. Auch ist es so, dass man nach einer Antwort für die nächsten paar Fragen immer noch eine geringere Wahrscheinlichkeit hat, da man erst wieder in den höheren Bereich der Liste geschoben werden muss. Die Idee mit der Wurzel ist zwar nett, aber erfüllt nicht ganz die Aufgabenstellung. |
Re: Gewichteter Zufall
Was imo aus dem Artikel nicht ganz klar wird: deine Lösung benachteiligt ja nicht die Schüler, die sich oft gemeldet haben, sondern die, die sich vor kurzem gemeldet haben.
Ich denke einmal, dass es so auch gedacht war; um jedenfalls Ersteres zu erreichen, müsste jedem Schüler nur eine Auswahl-Wahrscheinlichkeit p zugeordnet werden, die bei n Schülern anfangs 1 / n beträgt. Wenn er dann nach einer Meldung z.B. nur noch halb so oft aufgerufen werden soll, muss natürlich erst einmal seine eigene Wahrscheinlichkeit p1 um 50% gesenkt und zusätzlich die Wahrscheinlichkeiten aller anderen Schüler um .5 * p1 / (n - 1) erhöht werden. Die Auswahlfunktion könnte dann so aussehen:
Delphi-Quellcode:
[add]
// Rückgabewert: Index des gewählten Eintrags
// Summe der Wahrscheinlichkeiten sollte 1 betragen function RandomItem(aProbabilities: array of Real): Integer; var r: Real; begin r := Random; Result := 0; while Result < Length(aProbabilities) do begin r := r - aProbabilities[Result]; if r < 0 then begin Dec(Result); Exit; end; Inc(Result); end; Dec(Result); // im Zweifelsfall der letzte Eintrag end; Zitat:
Zitat:
[/add] |
Re: Gewichteter Zufall
Bei gewichtetem Zufall habe ich spontan an eine Zuordnungsliste gedacht. Alle Personen bekommen einen je gleich großen Zahlenbereich zwischen 0 und 1 zugewiesen. Mit einer Zufallszahl geht man dann in diese Liste, und schaut in wessen Bereich sie liegt. Anschließend wird die Liste neu Aufgebaut, wobei der Bereich der zuletzt gezogenen Person um einen Faktor verkleinert wird, während die Bereiche der anderen prozentual gleichmäßig vergrößert werden, so dass alle Bereich in Summe wieder 1 ergeben.
Das System ist allerdings dann gesprengt, wenn jemand so oft hintereinander gezogen wird, dass sein Bereich 0 wird (dank Ungenauigkeiten von Floats). Die Wahrscheinlichkeit dafür dürfte aber sehr gering sein, und ließe sich durch Einführen eines Minimums leicht beheben. Dies ließe sich sogar finetunen, da man über den Faktor bestimmen kann, wie stark ein gezogener "bestraft" werden soll, und sogar ob dies linear, prozentual, oder nach welchem Gesetz auch immer statt finden soll. Ebenso ist die Verteilung des frei gewordenen Bereichs anpassbar, so dass z.B. jemand mit großem Bereich stärker profitieren würde als jemand im Mittelfeld. Was ein solches Verfahren generell bewirkt ist, dass die Gleichverteilung auf alle Zufallszahlen eines Seeds bereits für eine kleinere Untermenge wählbar schnell forciert wird. |
Re: Gewichteter Zufall
Durch die Wurzel hast du einfach eine quadratische Verteilungsfunktion abgebildet.
Edit (wurde grad rausgerissen): Ich wollte noch ergänzen, dass dies eine lineare Dichtefunktion ergibt. Also anstatt der Glockenkurve bei der Normalverteilung, hast du eine lineare Funktion. |
Re: Gewichteter Zufall
Zitat:
Zitat:
|
Re: Gewichteter Zufall
Grafiken? Schwer.
Wenn du dir ![]() Wenn du für eine bestimmte Verteilung einen zufälligen Wert haben möchtest, dann nimmst du dir die Verteilungsfunktion (rechts) und einen gleichverteilten Zufallswert (random von 0 bis 1). Mit diesem Wert gehst du in die y-Achse der Verteilungsfunktion und liest den x-Wert ab. Fertig. Das bedeutet, du bildest mathematisch die Umkehrfunktion der Verteilungsfunktion. Wenn du jetzt als Umkehrfunktion der Verteilung eine Wurzelfunktion hast, ist die Verteilungsfunktion selbst eine quadratische. Und damit ist die Dichtefunktion (Ableitung der quadratischen Funktion) linear. |
Re: Gewichteter Zufall
Ah, ok, dann habe ich jetzt zumindest eine Erklärung. Mit dem Verstehen hapert es noch ein wenig, aber das ist Licht am Horizont. ;)
|
Re: Gewichteter Zufall
Jetzt bewegen wir uns bereits ganz nah am elementaren Standbein der Monte Carlo Simulation. Auch dort wird mit Verteilerfunktionen gearbeitet. Da das mal Thema meiner
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 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