Zufällige Permutation

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Eine Realisierung einer zufälligen Permutation der Spielkarten einer Farbe

Eine zufällige Permutation oder Zufallspermutation ist in der Mathematik eine zufällige Anordnung einer Menge von Objekten. Beispielsweise ist das Mischen der Karten eines Kartenspiels (im Idealfall) eine zufällige Permutation der Karten. In der Stochastik werden zufällige Permutationen als gleichverteilte Zufallsvariablen aus einem diskreten Wahrscheinlichkeitsraum angesehen, deren Werte Permutationen sind. So können auch Kennzahlen zufälliger Permutationen, wie die Anzahl der Fixpunkte, Fehlstände oder Zyklen, als diskrete Zufallsvariablen angesehen werden, deren Verteilungen dann analysiert werden. Im Computer können pseudozufällige Permutationen effizient mit dem Fisher-Yates-Verfahren generiert werden. Zufällige Permutationen werden unter anderem bei der Analyse von Sortierverfahren, in der Kryptographie und Kodierungstheorie sowie im Rahmen randomisierter Algorithmen untersucht.

Ist die symmetrische Gruppe aller Permutationen der Menge , dann ist eine zufällige Permutation eine auf gleichverteilte Zufallsvariable , das heißt eine Abbildung von einem Wahrscheinlichkeitsraum , sodass

für alle Permutationen gilt. Allgemeiner können auch Permutationen beliebiger endlicher Mengen, beispielsweise Alphabete, betrachtet werden. Zur Analyse der mathematischen Eigenschaften ist jedoch eine Beschränkung auf die ersten natürlichen Zahlen möglich.

Die Menge besteht aus den sechs Permutationen der Zahlen und , in Tupeldarstellung

.

Eine zufällige Permutation realisiert jede dieser sechs Permutationen mit der gleichen Wahrscheinlichkeit

.

Wird als zugrunde liegender Wahrscheinlichkeitsraum mit für alle gewählt, so kann durch die identische Abbildung dargestellt werden.

Zufälligen Permutationen zugeordnete Größen, wie die Anzahl der Fehlstände oder Zyklen, können ebenfalls als diskrete Zufallsvariablen interpretiert werden. Die Wahrscheinlichkeitsverteilung dieser Zufallsvariablen ist allerdings im Allgemeinen nicht mehr gleichverteilt. Ein wichtiges Hilfsmittel bei der Analyse dieser Wahrscheinlichkeitsverteilungen sind erzeugende Funktionen. Ist die Wahrscheinlichkeitsfunktion, dass die Zufallsvariable den Wert annimmt, dann wird die zugehörige wahrscheinlichkeitserzeugende Funktion durch

definiert. Dabei handelt es sich hier um eine exponentiell erzeugende Funktion. Der Erwartungswert der Zufallsvariable ist dann durch

gegeben und ihre Varianz entsprechend durch

.

Im Folgenden werden Wahrscheinlichkeitsverteilungen, Erwartungswerte und Varianzen einiger wichtiger Kenngrößen zufälliger Permutationen angegeben.

Anzahl der Fixpunkte

[Bearbeiten | Quelltext bearbeiten]
Häufigkeitsverteilung der Anzahl der Fixpunkte in einer zufälligen Permutation der Länge 7

Ein Fixpunkt in einer Permutation ist eine Zahl , für die gilt. Die Anzahl der Permutationen mit genau Fixpunkten wird durch die Rencontres-Zahlen angegeben (Folge A008290 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Fixpunkte einer Permutation hat die Form

.

Für den Erwartungswert und die Varianz der Anzahl der Fixpunkte gilt damit

und

.

Die Anzahl der Fixpunkte in einer zufälligen Permutation ist für asymptotisch poisson-verteilt mit Intensität .[1]

Anzahl der Anstiege

[Bearbeiten | Quelltext bearbeiten]
Häufigkeitsverteilung der Anzahl der Anstiege in einer zufälligen Permutation der Länge 7

Ein Anstieg in einer Permutation ist eine Zahl , für die gilt. Die Anzahl der Permutationen mit genau Anstiegen (analog Abstiegen) wird durch die Euler-Zahlen angegeben (Folge A008292 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Anstiege einer Permutation hat die Form

.

Für den Erwartungswert und die Varianz der Anzahl der Anstiege gilt damit

und

.

Die Anzahl der Anstiege in einer zufälligen Permutation ist bei entsprechender Normierung für asymptotisch normalverteilt.[2]

Anzahl der Fehlstände

[Bearbeiten | Quelltext bearbeiten]
Häufigkeitsverteilung der Anzahl der Fehlstände in einer zufälligen Permutation der Länge 7

Ein Fehlstand in einer Permutation ist ein Paar , für das und gilt. Die Anzahl der Permutationen mit genau Fehlständen wird durch die McMahon-Zahlen angegeben (Folge A008302 in OEIS). Die Wahrscheinlichkeitsfunktion der Anzahl der Fixpunkte einer Permutation hat die Form[3]

.

Für den Erwartungswert und die Varianz der Anzahl der Fehlstände gilt damit

und

.

Die Anzahl der Fehlstände in einer zufälligen Permutation ist bei entsprechender Normierung für asymptotisch normalverteilt.[4]

Anzahl der Zyklen

[Bearbeiten | Quelltext bearbeiten]
Häufigkeitsverteilung der Anzahl der Zyklen in einer zufälligen Permutation der Länge 7

Ein Zyklus in einer Permutation ist eine Folge verschiedener Zahlen , für die für und gilt. Jede Permutation kann vollständig in Zyklen zerlegt werden. Die Anzahl der Permutationen mit genau Zyklen wird durch die Stirling-Zahlen der ersten Art angegeben (Folge A130534 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Zyklen einer Permutation hat die Form

.

Für den Erwartungswert und die Varianz der Anzahl der Zyklen gilt damit

,

wobei die -te harmonische Zahl ist, und

,

wobei die -te harmonische Zahl zweiter Ordnung ist. Die Anzahl der Zyklen in einer zufälligen Permutation ist bei entsprechender Normierung für asymptotisch normalverteilt mit Erwartungswert und Varianz .[5]

Eine wichtige Aufgabe bei der Untersuchung von Algorithmen, beispielsweise Sortierverfahren, im Rahmen von Monte-Carlo-Simulationen ist die Erzeugung zufälliger Permutationen auf dem Computer. Die Grundidee ist hierbei die Verwendung uniform verteilter Pseudozufallszahlen mit Hilfe geeigneter Zufallszahlengeneratoren. Diese Pseudozufallszahlen werden dann auf geeignete Weise kombiniert, sodass eine pseudozufällige Permutation entsteht.

Direktes Verfahren

[Bearbeiten | Quelltext bearbeiten]

Bei einem direkten Ansatz wird zunächst eine aus den Zahlen von bis bestehende Liste betrachtet. Nach einer Ziehung einer uniform verteilten Zufallszahl zwischen und (einschließlich) wird das entsprechende Listenelement als die erste Zahl der Ergebnispermutation notiert und dieses Element anschließend aus der Liste gestrichen. Im nächsten Schritt wird dann eine uniform verteilte Zufallszahl zwischen und gezogen, das entsprechende Listenelement als zweite Zahl der Ergebnispermutation notiert und dieses Element ebenfalls wieder gestrichen. Dieses Vorgehen wird fortgesetzt, bis schließlich keine Zahl mehr in der Liste vorhanden und damit die Ergebnispermutation vollständig ist. In Pseudocode kann dieses Verfahren wie folgt implementiert werden:

function randperm(n)
  P = zeroes(n)          // Ergebnispermutation mit Nullen initialisieren
  N = [1:n]              // Feld mit den Zahlen von 1 bis n
  for i = 1 to n         // Schleife über die Einträge von P
    z = random(n-i+1)    // Gleichverteilte Zufallszahl zwischen 1 und n-i+1
    P(i) = N(z)          // Wähle als nächsten Eintrag die z-te verbleibende Zahl
    N = setdiff(N,N(z))  // Entferne diese Zahl aus den verbleibenden Zahlen
  end
  return P
Bereich Zufallszahl Auswahl Ergebnis
1–6 5 1 2 3 4 5 6 5
1–5 3 1 2 3 4 6 5 3
1–4 4 1 2 4 6 5 3 6
1–3 1 1 2 4 5 3 6 1
1–2 2 2 4 5 3 6 1 4
1–1 1 2 5 3 6 1 4 2

Bei diesem Verfahren werden die Plätze der Reihe nach durchgegangen, wobei jedem Platz eine zufällig aus den jeweils noch verfügbaren Zahlen ausgewählte Zahl zugewiesen wird. Alternativ kann auch der duale Ansatz verfolgt werden, bei dem die Zahlen der Reihe nach durchgegangen werden, wobei jeder Zahl ein zufällig ausgewählter noch freier Platz zugewiesen wird. In beiden Fällen leidet die Effizienz des Verfahrens darunter, dass es aufwändig ist, ein bestimmtes Element aus einer Liste zu entfernen, beziehungsweise einen bestimmten freien Platz zu finden. In einer Standardimplementierung benötigen diese Teilaufgaben im Mittel Operationen, sodass das Gesamtverfahren eine Laufzeitkomplexität der Ordnung

aufweist. In der nebenstehenden Tabelle findet sich ein Beispiel für die Funktionsweise dieses Verfahrens bei der Erzeugung einer pseudozufälligen Permutation der Länge sechs. Die in jedem Schritt ausgewählte und damit eliminierte Zahl ist dabei durchgestrichen dargestellt.

Fisher-Yates-Verfahren

[Bearbeiten | Quelltext bearbeiten]

Eine Verbesserung ist das Fisher-Yates-Verfahren (nach Ronald Fisher und Frank Yates). Dieses Verfahren arbeitet am Platz, das heißt, die Zahlen werden im Feld umsortiert und nicht in zusätzlichen Speicher kopiert. Sie werden schrittweise umsortiert, so dass am Ende eine zufällige Permutation entsteht. Um die aufwändige Suche nach einer noch nicht verwendeten Zahl zu vermeiden, wird in jedem Schritt die ausgewählte Zahl ans Ende des aktuell betrachteten Teilfelds gestellt, indem sie mit der letzten noch nicht ausgewählten Zahl vertauscht wird. Das Verfahren in Pseudocode:

function randperm(n)
  P = [1:n]             // Initialisierung mit der identischen Permutation
  for i = n downto 2    // Schleife über die Einträge von P (außer dem ersten)
    z = random(i)       // Gleichverteilte Zufallszahl 1 <= z <= i
    swap(P(i),P(z))     // Vertausche die Zahlen an den Stellen i und z
  end
  return P
end
Bereich Zufallszahl Permutation
1–6 5 1 2 3 4 5 6
1–5 3 1 2 3 4 6 5
1–4 4 1 2 6 4 3 5
1–3 1 1 2 6 4 3 5
1–2 2 6 2 1 4 3 5

Die Initialisierung kann dabei, wie im Codebeispiel, mit der identischen Permutation erfolgen, man kann aber auch von einer beliebigen Permutation ausgehen, die dann zufällig umsortiert wird. Die Permutationsroutine kann somit iterativ aufgerufen werden, wobei sie jeweils die vorherige Zufallspermutation umsortiert. Da die Vertauschung zweier Elemente eines Felds fester Größe mit einem konstanten Aufwand erfolgt, besitzt das Fisher-Yates-Verfahren eine Laufzeitkomplexität der Ordnung , eine erhebliche Verbesserung gegenüber dem direkten Verfahren. In der nebenstehenden Tabelle wird das Verfahren anhand eines Beispiels illustriert, bei dem eine pseudozufällige Permutation der Länge sechs erzeugt wird. Die jeweils miteinander vertauschten Zahlen sind dabei unterstrichen. Es kann vorkommen, dass eine Zahl mit sich selbst vertauscht wird, was keinen Effekt hat. Es wurden die gleichen Zufallszahlen verwendet wie in dem Beispiel zum direkten Verfahren, allerdings ist die Ergebnispermutation hier eine andere.

Dieses Verfahren ist beispielsweise in dem numerischen Softwarepaket MATLAB als eingebaute Funktion randperm verfügbar.[6]

  • Problem der 100 Gefangenen, ein mathematisches Rätsel, das auf zufälligen Permutationen basiert
  • RC4, ein Verfahren zur Stromverschlüsselung, das zufällige Permutationen verwendet
  • Bogosort, ein ineffizientes Sortierverfahren, das ebenfalls zufällige Permutationen verwendet
  • Linearer Kongruenzgenerator, ein Zufallszahlengenerator, der bei maximaler Periodenlänge eine pseudozufällige Permutation erzeugt
  • Golomb-Dickman-Konstante, der Erwartungswert der relativen Länge des längsten Zyklus in einer zufälligen Permutation für

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Alan Camina, Barry Lewis: An Introduction to Enumeration. Springer, 2011, ISBN 0-85729-600-0, S. 140.
  2. Philippe Flajolet, Robert Sedgewick: Analytic Combinatorics. Cambridge University Press, 2009, S. 658.
  3. Donald E. Knuth: The Art of Computer Programming, Volume 3: Sorting and Searching. S. 15–16.
  4. Vladimir Nikolaevič Sačkov: Probabilistic Methods in Combinatorial Analysis. Cambridge University Press, 1997, S. 30.
  5. Hosam M. Mahmoud: Sorting: A Distribution Theory. John Wiley & Sons, 2000, ISBN 0-471-32710-7, S. 48.
  6. randperm. In: MATLAB Documentation Center. The MathWorks, archiviert vom Original am 28. Januar 2013; abgerufen am 7. Dezember 2013.