Rätsel lösen mit R

Wie ich schon in „Nach S kommt R“ beschrieben habe, bin ich durch ein Projekt auf das mächtige Werkzeug R für statistische Berechnungen gekommen. Hier heute mal ein Beispiel, angeregt durch das sehr schöne und empfehlenswerte Buch „Fifty Challenging Problems in Probability with Solutions“ (ISBN-10: 0486653552, ISBN-13: 978-0486653556) von Frederick Mosteller. Die erste Aufgabe dort lautet:

Die Sockenschublade
Eine Schublade enthält rote und schwarze Socken. Wenn zwei Socken zufällig entnommen werden ist die Wahrscheinlichkeit dafür zwei rote Socken zu ziehen = 1/2.
a) Was ist die kleinstmögliche Anzahl von Socken in der Schublade?
b) Welche, wenn die Anzahl der schwarzen Socken gerade ist?

Wie sieht dazu die Lösung aus?

Formel Wahrscheinlichkeit 2 rote Socken
Wer wie ich sich schon in der Schulmathematik gerne mit Wahrscheinlichkeitsrechnung beschäftigt hat, bringt die Formel für die Ziehung von zwei roten Socken noch aufs Papier.

Um die Lösungen davon zu ermitteln, die wirklich 1/2 ergeben, kommt man um ein bisschen Probieren kaum herum. Warum also nicht ein kleines R-Script schreiben, das dieses Ausprobieren erledigt:

# Frederick Mosteller: 50 challenging problems in probability and solutions
# Aufgabe 01

fp <- function(r, b) { r / (r + b) * (r - 1) / (r + b - 1) }

max <- 30
phalf <- outer(1:max, 1:max, "fp") == 1/2

solution <- which(phalf, TRUE)

colnames(solution) <- c("red", "black")
print(solution)

Der Code ist sehr übersichtlich und kompakt:

In Zeile 4 wird die Funktion fp zum Berechnen der Wahrscheinlichkeit entsprechend der Formel definiert. Zeile 6 legt fest, dass bis zu 30 rote bzw. schwarze Socken in der Schublade sein dürfen.

Die eigentliche Lösung wird jetzt schon in Zeile 7 ermittelt: outer rechnet für die beiden Folgen von 1 bis 30 roten bzw. schwarzen Socken durch Aufruf von „fp“ die Wahrscheinlichkeit aus und gibt sie als 30×30 Matrix zurück. Durch den Vergleich mit der Vorgabe 1/2 wird daraus eine 30×30 Matrix von 900 Wahrheitswerten, die an der Position der Lösungen TRUE enthält, sonst FALSE. Bei 30 Socken sind das wirklich nur die beiden in der Aufgabe gefragten, bei 100 Socken gibt es drei Lösungen und bei 1000 bereits 4 Lösungen. Das ist der Charme der Aufgabenstellung, dass es wirklich nur so wenige gibt.

Das Heraussuchen der TRUE-Werte aus der Matrix ist ganz schön unübersichtlich, aber das erledigt für uns die Funktion which in Zeile 9 perfekt, die ein Array von Lösungen zurückgibt, jede in einer Zeile mit der Anzahl der roten Socken in der ersten Spalte, der der schwarzen in der zweiten Spalte. In Zeile 11 ein bisschen Namenskosmetik für die Spalten, damit das im Ausdruck von Zeile 12 auch sprechend ist.

Verraten wird die Lösung hier nicht, da aber R Open Source ist (siehe Vorgänger-Artikel) kann das jeder leicht nachrechnen lassen.

Oder sie der folgenden Graphik entnehmen:Wahrscheinlichkeit Ziehung zweier roter Socken

Diese wird mit folgendem Code generiert:

persp(1:max, 1:max, outer(1:max, 1:max, "fp"),
      main="Wahrscheinlichkeit für Ziehen von zwei roten Socken",
      xlab = "Rote Socken", ylab = "Schwarze Socken", zlab ="p(2 mal Rot)",
      theta=230, phi=25,
      shade=0.75) -> res
# Markierung der Lösungen
points(trans3d(solution[,1], solution[,2], 1/2, res), col="red")

Weil es so schön war habe ich das Problem noch mit zwei anderen Programmen bearbeitet, siehe dazu:

2 Gedanken zu „Rätsel lösen mit R

  1. Pingback: Rätsel Lösen mit Maxima | Hotchpotch Blog

  2. Pingback: Rätsel Lösen mit Geogebra | Hotchpotch Blog

Kommentare sind geschlossen.