If you're seeing this message, it means we're having trouble loading external resources on our website.

Wenn du hinter einem Webfilter bist, stelle sicher, dass die Domänen *. kastatic.org und *. kasandbox.org nicht blockiert sind.

Hauptinhalt

Beliebige Verteilung von Zufallszahlen

Irgendwann wirst du aber auch einmal etwas anderes als eine gleichförmige oder glockenförmige Verteilung von Zufallszahlen verwenden. Stellen wir uns einmal vor, du seihst ein Random-Walker auf der Suche nach Nahrung. Sich zufällig im Raum zu bewegen scheint eine sinnvolle Strategie zu sein um irgendetwas zu essen zu finden. Du weißt ja nicht wo das Essen ist, dann kannst du auch zufällig suchen, bis du es findest. Eventuell hast du das Problem aber schon bemerkt. Random-Walkers kehren immer wieder und sogar sehr oft an schon vorher besuchte Stellen zurück (Dies nennt man auch “Oversampling”). Ein Weg dieses Problem zu vermeiden ist es, ab und zu einen sehr großen Schritt zu machen. Dies erlaubt es dem Walker zufällig um bestimmte Stellen herum nach Futter zu suchen, während er in regelmäßigen Abständen an eine neue Stelle springt und so das Oversampling reduziert wird. Diese Variante des Random-Walk (bekannt als Lévy-Prozess) erfordert einen bestimmten Satz von Wahrscheinlichkeiten. Obwohl es keine exakte Umsetzung des Lévy-Prozesses ist, können wir die Wahrscheinlichkeiten wie folgt definieren: je größer der Schritt, desto kleiner die Wahrscheinlichkeit dass er gewählt wird, je kürzer der Schritt, desto größer.
Vorher haben wir diesem Abschnitt gesehen, dass man beliebige Wahrscheinlichkeitsverteilungen erstellen kann, wenn man ein Array mit Werten füllt und einige davon mehrfach verwendet, so dass sie öfters gewählt werden, oder indem man das Resultat von random() mit gewissen Bedingungen prüft. Wir können einen Lévy-Prozess implementieren, indem wir sagen dass es eine 1%ige Change gibt, dass der Walker einen großen Schritt macht.
var r = random(1);
// A 1% chance of taking a large step
if (r < 0{,}01) {
  xstep = random(-100, 100);
  ystep = random(-100, 100);
} else {
  xstep = random(-1, 1);
  ystep = random(-1, 1);
}
Dies reduziert aber die Wahrscheinlichkeiten auf eine feste Anzahl von Möglichkeiten. Was wenn wir eine allgemeinere Regel möchten? eine bei der größere Zahlen nach einer größeren Wahrscheinlichkeit gezogen werden? 3,145 hätte dann eine größere Wahrscheinlichkeit gezogen zu werden als 3,144, auch wenn diese Wahrscheinlichkeit nur wenig größer ist. In anderen Worten, wenn x die Zufallszahl ist, können wir die Wahrscheinlichkeit auf der y-Achse mit y = x abbilden.
Nature of Code Abbildung
Bild I.4
Wenn wir herausfinden können, wie wir eine Verteilung von Zufallszahlen gemäß dem Diagramm oben generieren können, dann können wir die gleiche Methode auf jede Kurve für welche wir eine Formel haben anwenden.
Eine Möglichkeit ist es, anstatt einer zwei Zufallszahlen zu generieren. Die erste Zufallszahl ist genau dies, eine zufällige Zahl. Die zweite aber, ist was wir einen ’qualifzierenden zufälligen Wert” nennen. Es sagt uns ob wir die erste Zahl verwenden sollen, oder eine neue ziehen müssen. Zahlen mit einer einfacheren Qualifikation werden öfters gezogen und Zahlen welche sich selten qualifizieren werden seltener gezogen. Hier die Schritte zur Umsetzung (vorläufig nur für Zahlen zwischen 0 und 1):
  1. Wähle eine zufällige Zahl: R1
  2. Berechne die Wahrscheinlichkeit P, dass R1 qualifiziert ist. Wir nehmen: P = R1.
  3. Wähle eine andere zufällige Zahl: R2
  4. Wenn R2 kleiner als P ist, dann haben wir unsere Zahl gefunden—R1!
  5. Wenn R2 nicht kleiner als P ist, gehen wir zurück zu Schritt 1 und beginnen vor vorn.
Was wir hier sagen ist, dass die Wahrscheinlichkeit dass eine Zufallszahl qualifiziert ist gleich der Zahl selbst ist. Nehmen wir an, wir ziehen für R1 0,1. Dies bedeutet, dass R1 mit einer Wahrscheinlichkeit von 10% qualifiziert ist. Wenn wir für R1 0,83 ziehen, ist sie mit einer Wahrscheinlichkeit von 83% qualifiziert. Je größer die Zahl, desto größer die Wahrscheinlichkeit, dass wir sie auch verwenden werden.
Hier eine Funktion (benannt nach der Monte Carlo Methode, welche nach dem Monte Carlo Casino benannt wurde) welche den Algorithmus oben implementiert und eine Zufallszahl zwischen 0 und 1 zurückgibt. Das folgende Programm benutz diese Werte für die Größe von Ellipsen, aber wir können diese auch für viele andere Dinge verwenden.

Der Kurs "Natürliche Simulationen" ist eine Bearbeitung von "The Nature of Code" von Daniel Shiffman, und wird unter der Creative Commons Attribution-NonCommercial 3,0 Unported Lizenz verwendet.

Willst du an der Diskussion teilnehmen?

Noch keine Beiträge.
Verstehst du Englisch? Klick hier, um weitere Diskussionen auf der englischen Khan Academy Seite zu sehen.