Ein Freund von mir hat mir einmal eine 'makellose' Taktik verraten, um das Roulettespiel zu schlagen.
1. bet on black
- if you loose, bet on black again but now double the amount
- if you win now, you will have not lost any money
- if you loose again, bet on black again but now double the amount
- if you win now, you will have not lost any money
- if you loose again, bet on black again but now double the amount
- if you win now, you will have not lost any money
- if you loose again, bet on black again but now double the amount
etc ...
- if you win, profit!
2. repeat
Die Idee ist, dass die Wahrscheinlichkeit, immer Rot zu bekommen, gegen Null konvergiert und Sie daher immer in der Lage sein sollten, verlorenes Geld zurückzugewinnen.
In diesem Dokument werde ich anhand der Wahrscheinlichkeitstheorie und von Simulationen erklären, warum diese Taktik fehlerhaft ist. Außerdem soll dieses Dokument dazu beitragen, die Simulation und das faule Plotten von Mustern in R zu erklären.
Glücksspiele in R simulieren
Beginnen wir damit, dass wir zunächst einen zufälligen Pfad simulieren und zeichnen. Für diese ersten Simulationen nehmen wir an, dass Sie jedes Mal, wenn Sie spielen, etwas gewinnen oder verlieren, je nach dem Ergebnis eines Münzwurfs. Eine mögliche Art, dies zu simulieren, ist über;
randints = function(num) {
sample(c(-1, 1), num, replace = TRUE)
}
df1 = data.frame(cs = cumsum(randints(100)), t = 1:100)
ggplot() + geom_line(data = df1, aes(t, cs), alpha = 0.8)
Es ist ganz einfach, eine weitere solche Linie zu simulieren und sie in die Grafik einzufügen.
df2 = data.frame(cs = cumsum(randints(100)), t = 1:100)
df3 = data.frame(cs = cumsum(randints(100)), t = 1:100)
ggplot() + geom_line(data = df1, aes(t, cs), alpha = 0.8) + geom_line(data = df2,
aes(t, cs), alpha = 0.8) + geom_line(data = df3, aes(t, cs), alpha = 0.8)
Der Code kann eleganter gestaltet werden, indem Sie die faule Auswertung der ggplot2-Bibliothek nutzen. Sie brauchen keine einzige Zeile Code zu schreiben. Sie können ihn stattdessen an eine Variable anhängen. ... + geom_line() + geom_line() + ...
df3 = data.frame(cs=cumsum(randints(100)), t=1:100)
p = ggplot()
p = p + geom_line(data=df1, aes(t,cs), alpha=0.8, color="red")
p = p + geom_line(data=df2, aes(t,cs), alpha=0.8, color="green")
p = p + geom_line(data=df3, aes(t,cs), alpha=0.8, color="blue")
p
Dies ist ein günstigeres Muster. Sie können der Variablen p immer wieder neue Plot-Ebenen (aus verschiedenen Datensätzen) hinzufügen und es wird kein einziges Pixel gezeichnet, bis Sie am Ende p aufrufen. Es ist für den Benutzer klar ersichtlich, dass der Ebene Zeile für Zeile neue Ebenen hinzugefügt werden und Sie können dieses Muster innerhalb einer for-Schleife verwenden. Das bedeutet, dass Sie viele Simulationen durchführen und sie von einer einzigen Funktion aus zeichnen können.
gamble_plot = function(nruns){
p = ggplot()
for(i in 1:nruns){
df = data.frame(cs=cumsum(randints(100)), t=1:100)
p = p + geom_line(data=df, aes(t,cs), alpha=0.1)
}
p
}
gamble_plot(300)
Bei diesem Muster ist es auch relativ einfach, Serien von Zockern Farben zuzuordnen, wenn sie zu einem langfristigen Gewinn oder Verlust führen. Außerdem könnte es sinnvoll sein, die Länge des zufälligen Pfades als Eingabe für unsere Simulationsfunktion zu verwenden.
gamble_plot = function(nruns, len){
p = ggplot()
for(i in 1:nruns){
color = "darkgreen"
df = data.frame(cs=cumsum(randints(len)), t=1:len)
if(select(df, cs)[len,] < 0) color = "darkorange"
p = p + geom_line(data=df, aes(t,cs), alpha=0.4, color=color)
}
p
}
gamble_plot(300, 200)
Casino Royale
Lassen Sie uns anhand dieses Diagrammmusters die Ergebnisse der 'fehlerfreien' Roulettetaktik simulieren. Die folgenden Funktionen helfen bei der Simulation.
gamble = function(moneyin){
if( runif(1) < 0.5 ) return(moneyin) # result is black
-moneyin # result is red
}
nextm = function(gamble, outcome){
if(outcome < 0) return(2*gamble) #on loose we double the money
1
}
simulate = function(maxt){
df = data.frame(time=as.numeric(c()), money=as.numeric(c()))
move = 0
outcome = 0
for(i in 1:maxt){
move = nextm(move, outcome)
outcome = gamble(move)
df = rbind(df, data.frame(time=i, money=outcome))
}
df$money = cumsum(df$money)
df
}
gamblersruin = function(num, maxsim){
p = ggplot()
for(i in 1:num){
df = simulate(maxsim)
p = p + geom_line(data=df, aes(time,money), alpha=0.3)
}
p
}
Beachten Sie, dass ich davon ausgehe, dass die Wahrscheinlichkeit, Schwarz zu bekommen (p_B) und zu bekommen (p_R), zunächst gleich 0.5 ist. Dies ist nicht die Art und Weise, wie ein Casino Roulette spielen würde, aber wir werden es als obere Grenze verwenden. Wenn ich zeigen kann, dass in dieser optimistischen Version des Roulettes der Ausgang dieser Taktik zweifelhaft ist, dann wird sie in einem realistischeren Roulettespiel sicher scheitern. Später werden wir auch ein realistischeres Roulettespiel betrachten.
Lassen Sie uns einige Ergebnisse überprüfen.
set.seed(1)
gamblersruin(1,100) + ggtitle('single simulation, 100 bets')
gamblersruin(1,1000) + ggtitle('single simulation, 1000 bets')
gamblersruin(1,10000) + ggtitle('single simulation, 10000 bets')
Autsch, auf lange Sicht sieht es so aus, als würden Sie einen Nettogewinn erzielen, aber Sie sind nicht ohne Risiko. Die Wahrscheinlichkeit, 12 Mal hintereinander rot zu bekommen, ist gering, aber wenn Sie dieses Spiel über einen sehr langen Zeitraum spielen, wird dieses Ereignis plötzlich wahrscheinlich. Und wenn es passiert, müssen Sie das mit 2^{12} ausgleichen.
Wahrscheinlichkeitsrechnung
Die Simulationen geben uns also Grund, pessimistisch zu sein, was die Taktik angeht, aber das langfristige Endergebnis scheint positiv zu sein. Was sagt uns die Mathematik?
Ich werde hier ein wenig formell sein, aber das ist selbstverständlich, wenn es um Mathematik geht. Nehmen wir an, wir spielen das Roulettespiel, bis wir einen Gewinn von 0 oder 1 erzielt haben. Betrachten wir dieses Ergebnis als eine stochastische Variable $G$. Beachten Sie, dass ein einzelnes Spiel $G$ mehrere Einsätze haben kann.
Dann lassen Sie p_B die Wahrscheinlichkeit für Schwarz, p_R die Wahrscheinlichkeit für Rot, s_B die Auszahlung für den Zustand Schwarz und s_R die Auszahlung für den Zustand Rot sein.
begin{aligned}
mathbb{E}(G) & = p_Bs_B + p_Rs_R = frac{1}{2} + sum_{k=1}^infty p_R^{k-1} p_B times 0 = frac{1}{2} \
end{aligned}
begin{aligned}
mathbb{E}(G^2) & = p_Bs_B^2 + p_Rs_R^2 = frac{1}{2} + sum_{k=1}^infty p_R^{k-1} p_B times 0 = frac{1}{2}\
end{aligned}
Die Varianz des Spiels wird dann über die Definition definiert.
begin{aligned}
Var(G) & = mathbb{E}(G^2) - left(mathbb{E}(G)right)^2 = frac{1}{2} - [frac{1}{2}]^2 = frac{1}{4}\
end{aligned}
Was passiert also, wenn wir dieses Spiel unendlich oft spielen?
lim_{ntoinfty} mathbb{E}(nG) = lim_{ntoinfty} frac{n}{2} = infty
lim_{ntoinfty} Var(nG) = lim_{ntoinfty} sum_{i=1}^n Var(G) = infty
Das könnte sich sehr merkwürdig anfühlen, sollte aber keine Überraschung sein. Wenn wir das Spiel unendlich lange spielen, haben wir auch ein unendliches Risiko. Laienhaft ausgedrückt: Wenn Sie unendlich viel Geld verdienen wollen, brauchen Sie unendlich viel Geld.
Glücksspieler scheitern
Selbst wenn wir davon ausgehen, dass Sie unendlich viel Geld setzen können, wird diese Taktik im wirklichen Leben scheitern. Der Hauptgrund dafür ist, dass Casinos in der Regel einen maximalen Einsatz für alle ihre Glücksspiele vorsehen. Sie können im Casino nie mehr als einen bestimmten Betrag setzen, was bedeutet, dass Sie die Verdopplungstaktik nicht unendlich oft anwenden können.
Wie wahrscheinlich ist es, während eines Spiels ein Casino-Limit zu erreichen?
mathbb{P}(text{no loss in 1 game}) = 1 - mathbb{P}(text{loss in 1 game}) = 1 - frac{1}{2^k} = frac{2^k - 1}{2^k}
Dies kann dann auf das Spielen von n Spielen ausgeweitet werden.
mathbb{P}(text{at least one loss in n games}) = mathbb{P}(text{no loss in n games}) = 1 - left( frac{2^k-1}{2^k} right)^n
Beachten Sie, dass Sie das Spiel jetzt nicht mehr unendlich lange spielen können, ohne einen solchen Verlust zu riskieren.
lim_{ntoinfty} 1 - left( frac{2^k-1}{2^k} right)^n = 1, forall k geq 1
f = function(k,n){
1 - ( (2^k - 1) / ( 2^k ) )^n
}
df = data.frame(prob=f(9,1:10000), n=1:10000, limit=" 512")
df = rbind(df, data.frame(prob=f(10,1:10000), n=1:10000, limit='1024'))
df = rbind(df, data.frame(prob=f(11,1:10000), n=1:10000, limit='2048'))
df = rbind(df, data.frame(prob=f(12,1:10000), n=1:10000, limit='4096'))
p = ggplot()
p = p + geom_line(data=df, aes(n, prob, colour=limit))
p + ggtitle("probability of hitting budget limit after 'n' gambles")
Beachten Sie auch, dass der Erwartungswert des Spiels G, den wir zuvor definiert haben, plötzlich Null wird, wenn wir die Grenzen des Casinos berücksichtigen.
mathbb{E}(G) = p_B times 1 - p_B{p_R}^{k-1} {2}^{k-1} = frac{1}{2} - frac{1}{2} = 0
Diese Schlussfolgerung ändert sich weiter, wenn wir nicht mehr davon ausgehen, dass p_B = p_R = 0.5. In dem realistischeren Casinospiel (indem wir auch die Zahl 37 auf dem Casinobrett berücksichtigen) würde der erwartete Wert nun zu:
mathbb{E}(G) = p_B times 1 - p^B{p_R}^{k-1} {2}^{k-1} = 0.4865 - 0.5135 = -0.027
Fail in Simulationen einbeziehen
Lassen Sie uns unter Berücksichtigung dieser Fakten noch einmal einige Simulationen durchführen.
nextm = function(gamble, outcome){
if(outcome < 0){
if(gamble > 500){
return(1)
}
return(2*gamble)
}
1
}
gamble = function(moneyin){
if( runif(1) < 0.4865 ) return(moneyin) # result is black
-moneyin # result is red
}
gamblersruin(50,2500) + ggtitle("50 more realistic simulations")
Und wir können sehen, dass sich diese Ergebnisse zu verteilen scheinen. Die Erstellung eines Histogramms der Endspielzustände zeigt uns, wie fehlerhaft die Taktik wirklich ist.
gamblersend = function(num, maxsim){
df = data.frame(time=as.numeric(c()), money=as.numeric(c()))
for(i in 1:num){
if( i %% 5 == 0 ){
cat(i, 'simulations have now runn')
}
df = rbind(df, simulate(maxsim)[maxsim,])
}
df
}
ends = gamblersend(200,2500) # big simulation, warning, takes long
p = ggplot()
p = p + geom_histogram(data=ends, aes(money), alpha=0.9, binwidth=1000)
p + ggtitle("histogram of casino outcomes after 2500 bets")
Die Taktik führt einfach nicht zu einem positiven Ergebnis, wir machen mit dieser Taktik definitiv einen durchschnittlichen Verlust.
> mean(ends$money)
[1] -336.2
Fazit
Diese unendlichen Wettstrategien, bei denen der Ausgang risikolos erscheint, sind als Martingale bekannt. Weitere Informationen dazu finden Sie auf Wikipedia. Mathematik ist ein nettes Werkzeug und sollte nicht ignoriert werden, wenn man sich mit diesen Strategien beschäftigt, aber um ihre Schwächen mit etwas vielleicht etwas Greifbarerem zu bestätigen, kann R ein großartiges Werkzeug sein. Das Erstellen und Ausführen von Simulationen in R ist einfacher, wenn Sie Ihre Simulation in kleinere funktionale Teile aufteilen. Auch die träge Auswertung von ggplot kann Ihnen dabei helfen, den Code, den Sie benötigen, sauber zu halten.
Unsere Ideen
Weitere Blogs
Contact




