Skip to Tutorial Content

Kombinatorik

Zur Kombinatorik wird keine eigentliche APP bereitgestellt, es wird hingegen das berühmte ‘Geburtstags-Paradoxon’ aufgezeigt. Zuerst können Sie aber im nächsten Abschnitt wieder eigene schriftliche Übungen generieren, im übernächsten Abschnitt wird dann auf das genannte Paradoxon eingegangen. Dabei lernen Sie kurz, was eine sogenannte Monte-Carlo-Simulation ist.

Übungs-Generator für schriftliche Aufgaben Kombinatorik (3) und Wahrscheinlichkeit (4)

Hier können Sie sich Lehrkräfte und Studierende schriftliche Übungen nach Zufallsprinzip generieren lassen. Die Übungen werden in ein Word-Dokument mit Lösungen geschrieben und dieses kann dann zum Zweck eigener Formatierungen noch angepasst werden. Diese Übungen beinhalten (fast) keine R-basierten Aufgaben sondern nur solche, die im Rahmen einer schriftlichen Aufgabe lösbar sind. Die Aufgabensätze werden als Word-Dokument generiert und können nach eigenen Bedürfnissen formatiert werden.

Das Geburtstagsparadoxon

Simulation in der Klasse

Geben Sie bitte untenstehend Ihren Vor- und Nachnamen und Ihr Geburtsdatum an. Anschliessend drücken Sie auf den Knopf ‘Geburtstag jetzt senden!’.

Theoretische Berechnung

Das Geburtstagsparadoxon beinhaltet die Berechnung der Wahrscheinlichkeit, dass es von zum Beispiel \(k=25\) Personen einer Studierenden-Gruppe mindestens zwei gemeinsame Geburtstage gibt. Sie können natürlich selbst eine Einschätzung vornehmen, ob dies wahrscheinlich ist oder nicht - die meisten Leute halten dies für sehr unwahrscheinlich.

Um Fragestellungen dieser Art zu lösen gibt es im Wesentlichen zwei Strategien - man löst das Problem mathematisch oder man simuliert das Problem am Computer. Versuchen wir zuerst gleich zweiteres.

Unter Nichtbeachtung von Schaltjahren gibt es \(n=365\) Tage im Jahr, an welchen die \(k=25\) Personen Geburtstag haben können. Es sei nun angenommen, dass jeder Tag als Geburtsdatum für eine Person gleich wahrscheinlich ist.

Die Fragestellung nach der Wahrscheinlichkeit, dass es von \(k\) Personen mit Geburtstagen Mehrfachgeburtstage gibt ist sehr komplex - so könnte es genau ein Doppelgeburtstag oder zwei, oder ein Dreifachgeburtstag und so weiter geben. Einfacher wird die Fragestellung, wenn man die Frage umkehrt und das Gegenteil beantwortet.

GEGENFRAGE:

Was ist die Wahrscheinlichkeit, dass es von \(k\) Geburtstagen keine Mehrfachgeburtstage gibt?

Anzahl mögliche Fälle: Theoretisch kann jede der \(k\) Personen an 365 Tagen im Jahr Geburtstag haben. Es ergibt sich für Person 1 also 365 Möglichkeiten, für Person 2 365 Möglichkeiten, für Person 3 365 Möglichkeiten usw. Insgesamt ergeben sich also folgende Anzahl Möglichkeiten:

\[\texttt{Mögliche Fälle} = 365^k\]

Für die Anzahl günstiger Fälle, also keine Mehrfachgeburtstage, ergibt sich Folgendes: Person 1 kann an 365 Tagen im Jahr Geburtstag haben, Person 2 dann aber nur noch an 364, Person 3 an 363, Person 25 and 341 Tagen (oder Person \(k\) an 365-\(k\)+1 Tagen):

\[\texttt{Günstige Fälle} = 365\cdot \dots \cdot (365-k+1) = \frac{365!}{(365-k+1)!}\]

Eine Wahrscheinlichkeit berechnet sich über

\[p = \frac{\texttt{Anzahl günstige Fälle}}{\texttt{Anzahl mögliche Fälle}}\]

Für keine Mehrfachgeburtstage erhalten wir somit

\[p = \frac{\frac{365!}{(365-k)!}}{365^k}\]

Die Wahrscheinlichkeit für Mehrfachgeburtstage lautet dann:

\[p = 1-\frac{\frac{365!}{(365-k)!}}{365^k}\]

Die Funktion können Sie in R oder mit einem Taschenrechner auswerten. In dieser Website ist die Funktion geb(k) hinterlegt, die Ihnen die Wahrscheinlichkeit ausrechnet, dass es unter \(k=25\) Personen Mehrfachgeburtstage gibt. Sie können sich die Wahrscheinlichkeiten auch für einen ganzen Vektor ausgeben lassen, z.B. k=1:50.

geb(25)
geb(1:50)

Den grafischen Verlauf für unterschiedliche Anzahlen Personen \(k\) können Sie untenstehend betrachten.

Monte-Carlo-Simulation Geburtstags-Paradoxon

Unter Nichtbeachtung von Schaltjahren gibt es \(n=365\) Tage im Jahr, an welchen die \(k=25\) Personen Geburtstag haben können. Es sei nun angenommen, dass jeder Tag als Geburtsdatum für eine Person gleich wahrscheinlich ist. Es gilt daher zu überprüfen, ob von \(25\) zufällig gezogenen Tagen einige mehrfach vorkommen oder nicht.

Übung 1

Mit der Funktion sample(x=, size=, replace=) können in R Zufallszahlen gezogen werden, dabei sind die Argumente:

  • x die Grundmenge, aus welchen Zahlen zu ziehen sind, hier aus dem Vektor 1-365, oder besser x=1:365
  • size stellt die Grösse der zu ziehenden Stichprobe dar, hier zum Beispiel size=k, oder \(k=25\)
  • replace besagt, ob die Stichprobe mit oder ohne Zurücklegen gezogen werden soll, oder ob der Tag 234 (zum Beispiel) mehrfach vorkommen darf, es ist also hier replace = TRUE zu wählen.

Ziehen Sie mit R \(k=25\) Geburtstage aus \(n=365\) Tagen, sortieren Sie die Tage und entscheiden Sie, ob es doppelte Geburtstage gibt. Durch mehrfaches Ausführen des Codes können Sie das Experiment wiederholen.

k<-25

geb <- sample(1:365, size=k, replace=TRUE)

sort(geb)

Übung 2

Ergänzen Sie nun obenstehenden Code mit einer Überprüfung, ob im vektor geb für die Geburtstage identische Geburtstage vorkommen.

  • Die Funktion unique(x) gibt alle einzigartigen Elemente eines Vektors x zurück.
  • Die Funktion length(x) gibt die Anzahl Einträge eines Vektors x zurück.
k<-25

geb <- sample(1:365, size=k, replace=TRUE)

sort(geb)
k<-25

geb <- sample(1:365, size=k, replace=TRUE)

sort(geb)

# Überprüfen, ob die Länge von unique(geb) kleiner wie die Länge von geb, also k, ist
# Falls ja gibt es Mehrfach-Geburtstage, ansonsten nicht

length(unique(geb))<k

Obiger R-Code gibt ein TRUE zurück, falls es Mehrfach-Geburtstage gibt, ansonsten FALSE. Wie zu sehen ist dies manchmal der Fall und manchmal nicht. Um nun eine Wahrscheinlichkeit mittels einer Simulation anzugeben müssen wir obigen Code vielleicht 1000 mal simulieren, um eine Einschätzung zu erlangen, wie oft davon Situationen mit Mehrfach-Geburtstagen sind.

Übung 3

Bauen Sie nun obenstehende Funktion so um, dass Ihnen in einer Code-Zeile ausgegeben wird, ob es Mehrfach-Geburtstage gibt oder nicht.

k<-25

length(unique(sample(1:365, size=k, replace=TRUE)))<k

Übung 4

Diese Code-Zeile, welche uns in einem Versuch angibt, ob es in einer Zufallsauswahl von \(k=25\) Personen Mehrfach-Geburtstage gibt wollen wir nun mehrfach wiederholen, zum Beispiel 100 mal oder 1000 mal. Gibt es von 100 Versuchen zum Beispiel 50 mal einen Mehrfachgeburtstag, so wäre die simulierte Wahrscheinlichkeit für Mehrfachgeburtstage unter \(k=25\) Personen also \(50\%\).

  • Die Funktion replicate(n,expr) führt den Befehl expr mehrfach aus (n mal).
  • Führen Sie obige Simulation nun 100 mal aus.
k<-25

replicate(100, length(unique(sample(1:365, size=k, replace=TRUE)))<k)

Sie sehen, dass obiger Code einen Vektor der Länge 100 produziert mit den Inhalten TRUE und FALSE, wobei TRUE für einen simulierten Durchgang mit Mehrfachgeburtstag steht.

Übung 5

Speichern Sie diesen Vektor im Vektor geb.sim und zählen Sie den Anteil an TRUE-Werten (Mehrfachgeburtstage) und geben Sie sich diesen Anteil als Wahrscheinlichkeit aus.

k<-25

geb.sim <- replicate(100, length(unique(sample(1:365, size=k, replace=TRUE)))<k)

# Zähle Anzahl TRUE Werte in geb.sim und Teile durch Anzahl
p <- length(which(geb.sim==TRUE))/100
p

Wie Sie sehen schwankt dieser simulierte Wert für die Wahrscheinlichkeit \(p\) immer leicht. Die Grössenordnung für \(p\) liegt aber im Bereich von \(p=57\%\).

Übung 6

Erhöhen Sie nun die Anzahl der Simulationen auf 1000.

k<-25
rep<-1000

geb.sim <- replicate(rep, length(unique(sample(1:365, size=k, replace=TRUE)))<k)

# Zähle Anzahl TRUE Werte in geb.sim und Teile durch Anzahl
p <- length(which(geb.sim==TRUE))/rep
p

Es fällt auf, dass die Resultate weniger stark um \(p=57\%\) schwanken, da wir viel mehr Simulationen getätigt haben. Die Schwankung von solchen Simulations-Resultaten nennt man Monte-Carlo-Fehler. Er wird kleiner, je grösser man die Anzahl Simulationen ansetzt, allerdings braucht es eben auch mehr Rechenzeit.

Den grafischen Verlauf für unterschiedliche Anzahlen Personen \(k\) können Sie untenstehend betrachten. Zusätzlich sind hier noch die simulierten Wahrscheinlichkeiten gezeigt.

Wahrscheinlichkeits-Rechnung Euro - Millions

Unter dem untenstehenden Link können die aktuellen Gewinnzahlen von Euro-Millions eingesehen werden. Beim Euro-Millions werden aus \(N=50\) Zahlen \(n=5\) Zahlen gezogen und aus \(Z=12\) Sternen werden \(z=2\) Sterne gezogen.

Die letzte Ziehung stammt vom 03.05.2026 und entspricht dem untenstehend abgebildeten Resultat. Dabei ist die Variable Anzahl die Anzahl der Gewinner in der jeweiligen Kategorie.

Richtige

Anzahl

Gewinn

Wahrscheinlichkeit

0

0 +

0 ++

1

1 +

1 ++

104637

18.25

2

1042'979

9.30

2 +

418568

14.35

2 ++

19149

39.65

3

62446

25.25

3 +

26222

32.30

3 ++

1229

175.80

4

1281

118.50

4 +

526

388.55

4 ++

27

4109.00

5

4

36824.15

5 +

4

157558.95

5 ++

0

0.00

Berechnen Sie nun (mit R) die Wahrscheinlichkeit, dass Sie bei einem Tipp in der Kategorie “1+” landen (was soviel heisst, dass Sie eine Richtige auf dem Hauptschein und einen richtigen Stern getippt haben).

nn<-50; n<-5; zz<-12; z<-2
nn<-50; n<-5; zz<-12; z<-2
rn<-1; rz<-1

p1<-choose(nn-n,n-rn)*choose(n,rn)/choose(nn,n)

p2<-choose(zz-z,z-rz)*choose(z,rz)/choose(zz,z)

p1*p2

Die Rechnung für Zeile 5 kann wie folgt illustriert werden: Um aus \(n=5\) ‘richtigen’ Zahlen 1 zu ziehen gibt es \({5 \choose 1}\) Möglichkeit. Um Aus \(N-n=45\) ‘falschen’ Zahlen \(4\) zu ziehen gibt es \({45 \choose 4}\) Möglichkeiten. Insgesamt gibt es \({50 \choose 50}\) Möglichkeiten, den Hauptschein auszufüllen. Somit liegt die Wahrscheinlichkeit für 1 richtige Zahl auf dem Hauptschein bei:

\[p = \frac{{45 \choose 4}\cdot {5 \choose 1}}{{50 \choose 5}}\]

Um Aus \(Z-z=10\) ‘falschen’ Zahlen \(1\) zu ziehen gibt es \({10 \choose 1}\) Möglichkeiten. Insgesamt gibt es \({12 \choose 2}\) Möglichkeiten, den Nebenschein auszufüllen. Somit liegt die Wahrscheinlichkeit für 1 richtige Zahl auf dem Nebenschein bei:

\[p = \frac{{10 \choose 1}\cdot {2 \choose 1}}{{12 \choose 2}}\]

Die finale Wahrscheinlichkeit ist somit:

\[p = \frac{{45 \choose 4}\cdot {5 \choose 1}}{{50 \choose 5}} \cdot \frac{{10 \choose 1}\cdot {2 \choose 1}}{{12 \choose 2}} = 10.655\%\]

Ergänzen Sie nun den obigen Code so, dass Sie alle Wahrscheinlichkeiten ausrechnen können. Dazu legen Sie einen Vektor rn<-c(0,0,0,1,1,1,...,5,5,5) und einen Vektor rz<-c(0,1,2,0,1,2,...,0,1,2) an, welche die Kombinationen aller möglichen richtigen Zahlen auf dem Haupt- und Nebenschein umfassen.

nn<-50; n<-5; zz<-12; z<-2
nn<-50; n<-5; zz<-12; z<-2
rn<-rep(0:5,each=3)
rz<-rep(0:2,6)

rn
rz


p1<-choose(nn-n,n-rn)*choose(n,rn)/choose(nn,n)

p2<-choose(zz-z,z-rz)*choose(z,rz)/choose(zz,z)

p1*p2

sum(p1*p2)

Offensichtlich haben \(0.63\) Millionen Teilnehmer Gewinne erzielt. Die Lotto-Gesellschaft weist aber offensichtlich nicht die Anzahl aller Teilnehmenden aus. Die wollen wir nun abschätzen.

Wie gross ist die Wahrscheinlichkeit, dass bei total \(T=20\) Millionen Teilnehmenden, exakt 104637 Gewinner in die Gruppe 1 ++ fallen? Berechnen Sie den Logarithmus der Wahrscheinlichkeit mittels R.

Die Wahrscheinlichkeit, dass von \(T=20\) Millionen Teilnehmenden die ersten \(k=104637\) in die Gruppe mit Wahrscheinlichkeit \(p=0.0053\) fallen und die restlichen \(T-k=19895363\) nicht, beträgt \(p^k \cdot (1-p)^{(T-k)}\). Allerdings werden ja nicht nur die ersten \(k=104637\) Teilnehmenden gewinnen können, vielmehr gibt es insgesamt \({T \choose k}\) Möglichkeiten, dass es genau so viele Gewinner in dieser Klasse gibt.

Die Wahrscheinlichkeit lautet also:

\[{T \choose k}\cdot p^k \cdot (1-p)^{(T-k)}\]

Rechnen Sie mit R diese Wahrscheinlichkeit untenstehend aus. Setzen Sie hierfür:

T<-20*10^6
k<-104637
p<-0.0053274

T<-
k<-
p<-
T<-
k<-
p<-

choose(T,k)*p^k*(1-p)^(n-k)

Offensichtlich ist die Wahrscheinlichkeit zu klein, als diese noch durch R numerisch angegeben werden kann. Eine Möglichkeit ist daher, logarithmierte Wahrscheinlichkeiten zu nutzen. Interessanterweise ist obige Funktion, die wir berechnen wollten, in R unter der Funktion dbinom() implementiert. Die Funktion nimmt die Argumente dbinom(x, size, prob, log=FALSE). Dabei ist:

  • x die Anzahl Personen in der gesuchten Gruppe, bei uns x = k = 104637
  • size die Anzahl an Personen, bei uns size = T = 20 Millionen
  • prob die Wahrscheinlichkeit, in die genannte Gruppe zu fallen und
  • log eine Option, ob die Wahrscheinlichkeit logarithmiert ausgegeben werden soll

Rechnen Sie mit R diese logarithmierte Wahrscheinlichkeit untenstehend aus. Setzen Sie hierfür:

T<-20*10^6
k<-104637
p<-0.0053274

T<-
k<-
p<-
T<-
k<-
p<-

choose(T,k)*p^k*(1-p)^(n-k)
dbinom(x=k, size=T, prob=p, log=F)

dbinom(x=k, size=T, prob=p, log=T)

Das bedeutet, dass die Wahrscheinlichkeit \(e^{-24}\) beträgt. Allfällige Unterschiede zur obigen Ausgabe erklären sich mit Rundungsfehlern (zum Beispiel beim Setzen von p<-...)

Benutzen Sie nun den Datensatz euro, um die logarithmierten Wahrscheinlichkeiten in der Spalte LogL für \(T=20\) Millionen Nutzer zu berechnen. Bilden Sie anschliessend die Summe über LogL.

T<-
euro
T<-
#euro

euro$LogL<-dbinom(x=euro$Anzahl,size=T,prob=euro$Wahrscheinlichkeit,log=T)
euro
sum(euro$LogL,na.rm=TRUE)

‘Spielen’ Sie nun etwas mit dem Code. Die Summe über LogL gibt Ihnen nun die Plausibilität des Szenarios \(T=20\) Millionen abgegebene Tips an, oder welchen Wert Sie eben auch einstellen. Umso höher der Summenwert, umso plausibler ist das Szenario. In unterem Plot sehen Sie die Summe LogL Über unterschiedliche Sznearien von Anzahl Tipps.

Das plausibelste Szenario ist anscheinend jenes mit \(20\) Millionen eingegangenen Tipps.

Ist dieses Resultat überraschend? Überlegen Sie sich, wie Sie diese Schätzung ohne dieses ‘komplizierte’ Vorgehen produziert hätte. Bilden Sie hierfür die Summe aller Gewinnwahrscheinlichkeiten auf dem Lottozettel euro, für welche die Anzahl Gewinner publiziert wurden.

which(!is.na(euro$Anzahl))
ps<-sum(euro$Wahrscheinlichkeit[which(!is.na(euro$Anzahl))],na.rm=TRUE)
anz<-sum(euro$Anzahl,na.rm=TRUE)
ps
anz

Offensichtlich haben 1.7 Millionen Teilnehmer eine kumulierte Wahrscheinlichkeit von 0.0771 realisiert. Wenn wir diese Zahl nun auf 100% hochrechnen erhalten wir \(\frac{1.7}{0.0771} = 21.8\) Millionen Teilnehmer.

Zum Schluss produzieren wir noch die Schätzungen der Anzahl ‘Gewinner’ in den fehlenden Werten der obigen Tabelle.

Richtige

Anzahl

Wahrscheinlichkeit

Auszahlung

Umsatz

0

7,882,913.1

0.3931627461

0.0

27,590,195.7

0 +

3,503,516.9

0.1747389983

0.0

12,262,309.2

0 ++

175,175.8

0.0087369499

0.0

613,115.5

1

4,806,654.3

0.2397333818

0.0

16,823,290.1

1 +

2,136,290.8

0.1065481697

0.0

7,477,017.8

1 ++

104,637.0

0.0053274085

1,909,625.2

366,229.5

2

1,042,979.0

0.0456635013

9,699,704.7

3,650,426.5

2 +

418,568.0

0.0202948895

6,006,450.8

1,464,988.0

2 ++

19,149.0

0.0010147445

759,257.8

67,021.5

3

62,446.0

0.0031858257

1,576,761.5

218,561.0

3 +

26,222.0

0.0014159225

846,970.6

91,777.0

3 ++

1,229.0

0.0000707961

216,058.2

4,301.5

4

1,281.0

0.0000724051

151,798.5

4,483.5

4 +

526.0

0.0000321801

204,377.3

1,841.0

4 ++

27.0

0.0000016090

110,943.0

94.5

5

4.0

0.0000003218

147,296.6

14.0

5 +

4.0

0.0000001430

630,235.8

14.0

5 ++

0.0

0.0000000072

0.0

0.0

Dabei wurden die Auszahlungen über die Gewinne pro Tipp-Kategorie und der Anzahl Gewinner aus der Tabelle am Seitenanfang berechnet. Der Umsatz wurde aus den geschätzten Teilnehmer-Zahlen (in rot) aus den total geschätzten Teilnahmezahlen mal der Erfolgswahrscheinlichkeit berechnet, wobei ein Tipp aktuell 3.50 EURO kostet.

Für die Lotterie-Gesellschaft gab es nun per 03.05.2026 folgendes finanzielles Ergebnis (geschätzt):

Stichtag

Teilnehmer

Auszahlungen

Umsatz

Gewinn

03.05.2026

20,181,622

22,259,480

70,635,680

48,376,200

Pro abgegebenen Tipp hat die Gesellschaft am Ziehungstag 03.05.2026 einen Gewinn von 2.4 EURO erwirtschaftet.

Einführung in R - APP für Kombinatorik und Wahrscheinlichkeit