Zufällige Permutation

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.

Definition

Ist S n {\displaystyle S_{n}} die symmetrische Gruppe aller Permutationen der Menge { 1 , , n } {\displaystyle \{1,\ldots ,n\}} , dann ist eine zufällige Permutation eine auf S n {\displaystyle S_{n}} gleichverteilte Zufallsvariable Π {\displaystyle \Pi } , das heißt eine Abbildung Π : Ω S n {\displaystyle \Pi \colon \Omega \to S_{n}} von einem Wahrscheinlichkeitsraum ( Ω , A , P ) {\displaystyle (\Omega ,{\mathcal {A}},P)} , sodass

P ( Π = π ) = 1 n ! {\displaystyle P(\Pi =\pi )={\frac {1}{n!}}}

für alle Permutationen π S n {\displaystyle \pi \in S_{n}} 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 n {\displaystyle n} natürlichen Zahlen möglich.

Beispiel

Die Menge S 3 {\displaystyle S_{3}} besteht aus den sechs Permutationen der Zahlen 1 , 2 {\displaystyle 1,2} und 3 {\displaystyle 3} , in Tupeldarstellung

S 3 = { ( 1 , 2 , 3 ) , ( 1 , 3 , 2 ) , ( 2 , 1 , 3 ) , ( 2 , 3 , 1 ) , ( 3 , 1 , 2 ) , ( 3 , 2 , 1 ) } {\displaystyle S_{3}=\{(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)\}} .

Eine zufällige Permutation Π {\displaystyle \Pi } realisiert jede dieser sechs Permutationen π S 3 {\displaystyle \pi \in S_{3}} mit der gleichen Wahrscheinlichkeit

P ( Π = π ) = 1 6 {\displaystyle P(\Pi =\pi )={\frac {1}{6}}} .

Wird als zugrunde liegender Wahrscheinlichkeitsraum ( S 3 , P ( S 3 ) , P ) {\displaystyle (S_{3},{\mathcal {P}}(S_{3}),P)} mit P ( { π } ) = 1 6 {\displaystyle P(\{\pi \})={\tfrac {1}{6}}} für alle π S 3 {\displaystyle \pi \in S_{3}} gewählt, so kann Π {\displaystyle \Pi } durch die identische Abbildung dargestellt werden.

Eigenschaften

Zufälligen Permutationen zugeordnete Größen, wie die Anzahl der Fehlstände oder Zyklen, können ebenfalls als diskrete Zufallsvariablen X = X ( Π ) {\displaystyle X=X(\Pi )} 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 P X ( k ) = P ( X = k ) {\displaystyle P_{X}(k)=P(X=k)} die Wahrscheinlichkeitsfunktion, dass die Zufallsvariable X {\displaystyle X} den Wert k N 0 {\displaystyle k\in \mathbb {N} _{0}} annimmt, dann wird die zugehörige wahrscheinlichkeitserzeugende Funktion durch

g ( x ) = k = 0 P X ( k ) x k {\displaystyle g(x)=\sum _{k=0}^{\infty }P_{X}(k)\cdot x^{k}}

definiert. Dabei handelt es sich hier um eine exponentiell erzeugende Funktion. Der Erwartungswert der Zufallsvariable X {\displaystyle X} ist dann durch

E ( X ) = k = 0 k P X ( k ) = g ( 1 ) {\displaystyle \operatorname {E} (X)=\sum _{k=0}^{\infty }k\cdot P_{X}(k)=g'(1)}

gegeben und ihre Varianz entsprechend durch

Var ( X ) = k = 0 ( k E ( X ) ) 2 P X ( k ) = g ( 1 ) + g ( 1 ) ( 1 g ( 1 ) ) {\displaystyle \operatorname {Var} (X)=\sum _{k=0}^{\infty }(k-\operatorname {E} (X))^{2}\cdot P_{X}(k)=g''(1)+g'(1)(1-g'(1))} .

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

Anzahl der Fixpunkte

Häufigkeitsverteilung der Anzahl der Fixpunkte in einer zufälligen Permutation der Länge 7

Ein Fixpunkt in einer Permutation π {\displaystyle \pi } ist eine Zahl i { 1 , , n } {\displaystyle i\in \{1,\ldots ,n\}} , für die π ( i ) = i {\displaystyle \pi (i)=i} gilt. Die Anzahl der Permutationen π S n {\displaystyle \pi \in S_{n}} mit genau k {\displaystyle k} Fixpunkten wird durch die Rencontres-Zahlen D n , k {\displaystyle D_{n,k}} angegeben (Folge A008290 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Fixpunkte einer Permutation π S n {\displaystyle \pi \in S_{n}} hat die Form

g ( x ) = k = 0 n D n , k n ! x k = k = 0 n j = 0 n k ( 1 ) j x k j ! k ! {\displaystyle g(x)=\sum _{k=0}^{n}{\frac {D_{n,k}}{n!}}\,x^{k}=\sum _{k=0}^{n}\sum _{j=0}^{n-k}{\frac {(-1)^{j}\,x^{k}}{j!\,k!}}} .

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

E ( X ) = k = 0 n 1 D n 1 , k ( n 1 ) ! = 1 {\displaystyle \operatorname {E} (X)=\sum _{k=0}^{n-1}{\frac {D_{n-1,k}}{(n-1)!}}=1}

und

Var ( X ) = k = 0 n 2 D n 2 , k ( n 2 ) ! = 1 {\displaystyle \operatorname {Var} (X)=\sum _{k=0}^{n-2}{\frac {D_{n-2,k}}{(n-2)!}}=1} .

Die Anzahl der Fixpunkte in einer zufälligen Permutation ist für n {\displaystyle n\to \infty } asymptotisch poisson-verteilt mit Intensität λ = 1 {\displaystyle \lambda =1} .[1]

Anzahl der Anstiege

Häufigkeitsverteilung der Anzahl der Anstiege in einer zufälligen Permutation der Länge 7

Ein Anstieg in einer Permutation π {\displaystyle \pi } ist eine Zahl i {\displaystyle i} , für die π ( i + 1 ) > π ( i ) {\displaystyle \pi (i+1)>\pi (i)} gilt. Die Anzahl der Permutationen π S n {\displaystyle \pi \in S_{n}} mit genau k {\displaystyle k} Anstiegen (analog Abstiegen) wird durch die Euler-Zahlen A n , k {\displaystyle A_{n,k}} angegeben (Folge A008292 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Anstiege einer Permutation π S n {\displaystyle \pi \in S_{n}} hat die Form

g ( x ) = k = 0 n 1 A n , k n ! x k = 1 n ! k = 0 n 1 j = 0 k ( 1 ) j ( n + 1 j ) ( k + 1 j ) n x k {\displaystyle g(x)=\sum _{k=0}^{n-1}{\frac {A_{n,k}}{n!}}\,x^{k}={\frac {1}{n!}}\sum _{k=0}^{n-1}\sum _{j=0}^{k}\,(-1)^{j}{\binom {n+1}{j}}(k+1-j)^{n}\,x^{k}} .

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

E ( X ) = n 1 2 {\displaystyle \operatorname {E} (X)={\frac {n-1}{2}}}

und

Var ( X ) = n + 1 12 {\displaystyle \operatorname {Var} (X)={\frac {n+1}{12}}} .

Die Anzahl der Anstiege in einer zufälligen Permutation ist bei entsprechender Normierung für n {\displaystyle n\to \infty } asymptotisch normalverteilt.[2]

Anzahl der Fehlstände

Häufigkeitsverteilung der Anzahl der Fehlstände in einer zufälligen Permutation der Länge 7

Ein Fehlstand in einer Permutation π {\displaystyle \pi } ist ein Paar ( i , j ) {\displaystyle (i,j)} , für das i < j {\displaystyle i<j} und π ( i ) > π ( j ) {\displaystyle \pi (i)>\pi (j)} gilt. Die Anzahl der Permutationen π S n {\displaystyle \pi \in S_{n}} mit genau k {\displaystyle k} Fehlständen wird durch die McMahon-Zahlen M n , k {\displaystyle M_{n,k}} angegeben (Folge A008302 in OEIS). Die Wahrscheinlichkeitsfunktion der Anzahl der Fixpunkte einer Permutation π S n {\displaystyle \pi \in S_{n}} hat die Form[3]

g ( x ) = k = 0 n ( n 1 ) / 2 M n , k n ! x k = 1 n ! i = 1 n j = 0 n i x j = 1 n ! i = 1 n 1 x i 1 x {\displaystyle g(x)=\sum _{k=0}^{n(n-1)/2}{\frac {M_{n,k}}{n!}}\,x^{k}={\frac {1}{n!}}\prod _{i=1}^{n}\sum _{j=0}^{n-i}x^{j}={\frac {1}{n!}}\prod _{i=1}^{n}{\frac {1-x^{i}}{1-x}}} .

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

E ( X ) = i = 1 n i 1 2 = n ( n 1 ) 4 {\displaystyle \operatorname {E} (X)=\sum _{i=1}^{n}{\frac {i-1}{2}}={\frac {n(n-1)}{4}}}

und

Var ( X ) = i = 1 n i 2 1 12 = n ( 2 n + 5 ) ( n 1 ) 72 {\displaystyle \operatorname {Var} (X)=\sum _{i=1}^{n}{\frac {i^{2}-1}{12}}={\frac {n(2n+5)(n-1)}{72}}} .

Die Anzahl der Fehlstände in einer zufälligen Permutation ist bei entsprechender Normierung für n {\displaystyle n\to \infty } asymptotisch normalverteilt.[4]

Anzahl der Zyklen

Häufigkeitsverteilung der Anzahl der Zyklen in einer zufälligen Permutation der Länge 7

Ein Zyklus in einer Permutation π {\displaystyle \pi } ist eine Folge verschiedener Zahlen i 1 , i 2 , , i k {\displaystyle i_{1},i_{2},\ldots ,i_{k}} , für die π ( i j ) = i j + 1 {\displaystyle \pi (i_{j})=i_{j+1}} für j = 1 , , k 1 {\displaystyle j=1,\ldots ,k-1} und π ( i k ) = i 1 {\displaystyle \pi (i_{k})=i_{1}} gilt. Jede Permutation kann vollständig in Zyklen zerlegt werden. Die Anzahl der Permutationen π S n {\displaystyle \pi \in S_{n}} mit genau k {\displaystyle k} Zyklen wird durch die Stirling-Zahlen der ersten Art s n , k {\displaystyle s_{n,k}} angegeben (Folge A130534 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Zyklen einer Permutation π S n {\displaystyle \pi \in S_{n}} hat die Form

g ( x ) = k = 1 n s n , k n ! x k = 1 n ! k = 1 n ( x + k 1 ) {\displaystyle g(x)=\sum _{k=1}^{n}{\frac {s_{n,k}}{n!}}\,x^{k}={\frac {1}{n!}}\prod _{k=1}^{n}(x+k-1)} .

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

E ( X ) = k = 1 n 1 k = H n {\displaystyle \operatorname {E} (X)=\sum _{k=1}^{n}{\frac {1}{k}}=H_{n}} ,

wobei H n {\displaystyle H_{n}} die n {\displaystyle n} -te harmonische Zahl ist, und

Var ( X ) = k = 1 n k 1 k 2 = H n H n ( 2 ) {\displaystyle \operatorname {Var} (X)=\sum _{k=1}^{n}{\frac {k-1}{k^{2}}}=H_{n}-H_{n}^{(2)}} ,

wobei H n ( 2 ) {\displaystyle H_{n}^{(2)}} die n {\displaystyle n} -te harmonische Zahl zweiter Ordnung ist. Die Anzahl der Zyklen in einer zufälligen Permutation ist bei entsprechender Normierung für n {\displaystyle n\to \infty } asymptotisch normalverteilt mit Erwartungswert und Varianz log n {\displaystyle \log n} .[5]

Erzeugung

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

Bei einem direkten Ansatz wird zunächst eine aus den Zahlen von 1 {\displaystyle 1} bis n {\displaystyle n} bestehende Liste betrachtet. Nach einer Ziehung einer uniform verteilten Zufallszahl zwischen 1 {\displaystyle 1} und n {\displaystyle n} (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 1 {\displaystyle 1} und n 1 {\displaystyle n-1} 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 O ( n ) {\displaystyle O(n)} Operationen, sodass das Gesamtverfahren eine Laufzeitkomplexität der Ordnung

O ( n 2 ) {\displaystyle O(n^{2})}

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

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 O ( n ) {\displaystyle O(n)} , 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

  • 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 n {\displaystyle n\to \infty }

Literatur

  • Miklós Bóna: Combinatorics of Permutations (= Discrete Mathematics and Its Applications. Nr. 72). 2. Auflage. CRC Press, 2012, ISBN 1-4398-5051-8. 
  • Philippe Flajolet, Robert Sedgewick: Analytic Combinatorics. Cambridge University Press, 2009, ISBN 1-139-47716-1. 
  • Donald E. Knuth: The Art of Computer Programming. 3. Auflage. Volume 2: Seminumerical Algorithms. Addison-Wesley, 1997, ISBN 0-201-89684-2. 
  • Donald E. Knuth: The Art of Computer Programming. 2. Auflage. Volume 3: Sorting and Searching. Addison-Wesley, 1998, ISBN 0-201-89685-0. 

Weblinks

Einzelnachweise

  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.