Zufällige Permutation

Mathematik

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.

Eine Realisierung einer zufälligen Permutation der Spielkarten einer Farbe

Definition

Bearbeiten

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.

Beispiel

Bearbeiten

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.

Eigenschaften

Bearbeiten

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
 
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
 
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
 
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
 
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]

Erzeugung

Bearbeiten

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

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

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]

Siehe auch

Bearbeiten
  • 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  

Literatur

Bearbeiten
Bearbeiten

Einzelnachweise

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.