ProgrammieraufgabenHier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.
Glückspielvorteil
Diskussion: Glückspielvorteil im Forum Programmieraufgaben, in der Kategorie Code Kitchen; 10 gegen 3
Das Spiel wird mit 2 Spielern gespielt:
Der erste Spieler setzt 10 Euro - diese sind dem ...
10 gegen 3
Das Spiel wird mit 2 Spielern gespielt:
Der erste Spieler setzt 10 Euro - diese sind dem zweiten Spieler auf jeden Fall sicher.
Der zweite Spieler würfelt (mit 3 Würfeln) - die Augensumme wird zusammengezählt. Diesen Betrag zahlt der zweite Spieler an den ersten aus.
D.h er bekommt vom ersten Spieler 10 Euro und zahlt die gewürfelte Augensumme an diesen aus.
1.was wäre Deine intuitive Antwort (ohne Programmieren/Rechnen):
wer ist hier im Vorteil ?
Programmieraufgabe:
Dein Programm soll ausgeben, welcher Spieler im Vorteil ist (und/oder ein paar Zahlen ausgeben, so dass es aus diesen ersichtlich wird).
Es bieten sich folgende Varianten: eine Simulation, die das Spiel mehrere 1000 Male durchführt - was kommt hier raus?
oder: ein Programm, welches alle möglichen Würfelkombinationen samt zugehöriger Summe errechnet und aus diesen Daten irgendwelche "Erkenntnisse" gewinnt.
zu den beiden Varianten
bei der Simulation könnten die Spieler mit einem Startkapital anfangen - nach 1000 Runden könnte man diese Werte vergleichen.
Kombinationen:
einfach alle möglichen Kombinationen der 3 Würfel bilden. Nun soll das Programm berechnen, wieviele Kombinationen eine Augensumme <10,>=10 usw. haben.
m übrigen geht es darum den Quelltext eurer Lösung zu veröffentlichen. Gerne werden auch Binärdateien angenommen, aber Quelltext ist Pflicht, schließlich soll das ganze auch für andere User einen Sinn ergeben.
Beim Posten des Quelltextes verwendet bitte den Spoiler- mit Code-Tag:
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
intuitive antwort: da die zahl zwischen 3 und 12 liegt würde ich sagen, der vorteil liegt beim zweiten spieler, da durchschnittlich um die 7,5 augen liegen. code reiche ich nach. ist wahrscheinlich total falsch
edit: zwischen 3 und 18 natürlich
die lösung ist aber interessant:
Code:
//
// * Spieler A bezahlt 10? an Spieler B
// * Spieler B würfelt mit drei Würfeln
// * Spieler B bezahlt die Anzahl der Augen an Spieler A in ?
//
// Frage: Wer ist im Vorteil?
// Getestet wird in 1.000.000 Durchläufen
//
using System;
class Gluecksspiel {
public static void Main() {
Random wuerfel = new Random();
int vorteilA = 0;
int vorteilB = 0;
int gewinnA = 0;
int gewinnB = 0;
int vorteilNiemand = 0;
for( int i=0; i<1000000; i++) {
int wurf1 = wuerfel.Next(1, 7);
int wurf2 = wuerfel.Next(1, 7);
int wurf3 = wuerfel.Next(1, 7);
if( (wurf1 + wurf2 + wurf3) > 10) {
vorteilA++;
gewinnA += (wurf1 + wurf2 + wurf3)-10;
} else if( (wurf1 + wurf2 + wurf3) < 10) {
vorteilB++;
gewinnB += 10-(wurf1 + wurf2 + wurf3);
} else {
vorteilNiemand++;
}
}
gewinnA -= 1000000;
gewinnB -= 1000000;
Console.WriteLine("Vorteile für Spieler A: {0}", vorteilA);
Console.WriteLine("Gewinn von Spieler A: {0}\n", gewinnA);
Console.WriteLine("Vorteile für Spieler B: {0}", vorteilB);
Console.WriteLine("Gewinn von Spieler B: {0}\n", gewinnB);
Console.WriteLine("Ausgleichende Gerechtigkeit: {0}", vorteilNiemand);
}
}
Ausgabe:
Vorteile für Spieler A: 500009
Gewinn von Spieler A: 458121
Vorteile für Spieler B: 374508
Gewinn von Spieler B: -42793
Ausgleichende Gerechtigkeit: 125483
SpielerA bekommt also in 50% aller fälle mehr geld zurück bei einem Gewinn von etwa 46cent pro Spiel.
Original von xeno
intuitive antwort: da die zahl zwischen 3 und 12 liegt würde ich sagen, der vorteil liegt beim zweiten spieler, da durchschnittlich um die 7,5 augen liegen. code reiche ich nach. ist wahrscheinlich total falsch
Denke bei 3 Würfeln liegt die Zahl zwischen 3 und 18.
Intuitiv werden die Zahlen 9,10,11,12 am öftersten gewürfelt also glaube ich, dass Spieler 1 die besseren Karten besitzt.
@xeno: Ich denke, du hast da einen kleinen Schönheitsfehler in deinem Programm:
...
Du zählst Vorteile, aber nicht, wie groß diese Vorteile tatsächlich sind. So könnte es theoretisch sein, dass Spieler 2 in der Hälfte der Fälle 1 Euro gewinnt, in der anderen Hälfte aber 5 Euro verliert. ;)
Meine Lösung (Python)
Code:
import random
geldA = 0
for i in range(100000):
summe = random.randrange(1, 7)
summe += random.randrange(1, 7)
summe += random.randrange(1, 7)
geldA = geldA - 10 + summe
print "Geldgewinn von Spieler 1:", geldA, "Euro"
print "Geldgewinn von Spieler 2:", -geldA, "Euro"
Einige Testläufe über 100 000 Spiele:
Geldgewinn von Spieler 1: 50860 Euro
Geldgewinn von Spieler 2: -50860 Euro
-------
Geldgewinn von Spieler 1: 48116 Euro
Geldgewinn von Spieler 2: -48116 Euro
-------
Geldgewinn von Spieler 1: 48626 Euro
Geldgewinn von Spieler 2: -48626 Euro
Spieler 1 gewinnt also grob gerundet pro Spiel durchschnittlich 50ct.
Das würde sich auch in etwa mit meinem mathematischen Ansatz decken:
Ein Würfel zeigt im Durchschnitt (1+2+3+4+5+6)/6 (=3,5) an. Bei drei Würfeln wäre das 3,5 * 3 = 10,5.
stimmt, hab ich nicht dran gedacht. hab das mal eingebaut und festgestellt, daß Spieler A tatsächlich etwa 46cent pro runde gewinnt. kannst du diesen genaueren wert bestätigen?
@goflo, ich glaube du hast noch nen kleinen Denkfehler in deinem Programm
...
Code:
r = (rand() % 16) + 3;
Du würfelst mit nur 1nen Würfel welcher die Augenzahlen 3-18 besitzt anstatt mit 3 Würfel(Augenzahl je Würfel = 1-6)
=> bei dir ist die Chance eine 18 zu würfeln genausogroß wie jene Chance eine 11 zu würfeln. Ne 18 kannst du aber nur mit 3 6er erreichen, im Gegensatz dazu eine 11 mit 3+3+5, 4+4+3, 6+4+1, usw..
Original von xeno
hab das mal eingebaut und festgestellt, daß Spieler A tatsächlich etwa 46cent pro runde gewinnt. kannst du diesen genaueren wert bestätigen?
Das kommt ungefähr hin. Ich habe etwa 50 Cent pro Runde ausgerechnet.
//Was fuer eine Augensumme hat Spieler2 im Schnitt $sum = 0; for($i=3;$i<=18; $i++) { $sum += $kombinationen[$i]*$i; } $durchschnittsgewinn = $sum/(6*6*6);
echo "Durchschnittsaugenzahl für Spieler 2: $durchschnittsgewinn (Augensumme) <br>"; echo "Macht fuer Spieler 1: ".($durchschnittsgewinn - $einsatz_spieler_1)." Euro pro Spiel";
?>
Oder mathematisch:
Mathematik
Die Anzahl an Kombinationen für eine bestimmte Augensumme ist zwischen 10 und 11 symmetrisch, d.h. P(10) = P(11), P(9) = P(12) usw. (achja, hier zu sagen, dass ein Würfel die Zahlen 1 bis 6 hat und der Schnitt 3,5 ist, also 3*3,5=10,5 reicht so noch nicht aus, wenn man für Kombinationen argumentiert.)
Da Spieler1 10 Euro einsetzt, wird er häufiger etwas gewinnen als verlieren, da er nur bei 3 bis 9 verliert, bei 11 bis 18 gewinnt. Also bei 7 Augensummen verliert, bei 8 Augensummen gewinnt, und 1 mal nix passiert.
Da er bei 9 einen Euro verliert aber bei 11 einen Euro gewinnt und P(11) > P(9) gilt, stehen seine Chancen ganz gut ;)
Um das zu berechnen was Spieler1 gewinnt:
Naja Spieler2 muss ja für jeden Würfel die Augenzahl an Spieler1 zurückzahlen. Da ein Würfel die Augenzahlen 1, ..., 6 hat, und jede gleich wahrscheinlich ist, muss Spieler2 pro Würfel im Schnitt 3,50 Euro Zahlen, Insgesamt also im Schnitt 10,50 Euro.
Sind also 27 Möglichkeiten, eine 10 zu würfeln, 81 unter 10 zu bleiben und 108 > als 10
vollständigkeitshalber die Simulation:
Code:
wuerfele(Sum):-Sum is random(6)+random(6)+random(6)+3.
sim(0,0,0).
sim(Count,P1,P2):-NCount is Count-1,
sim(NCount,P1_,P2_),wuerfele(Num),P1 is P1_-10+Num,P2 is P2_+10-Num.
Original von xeno
hab das mal eingebaut und festgestellt, daß Spieler A tatsächlich etwa 46cent pro runde gewinnt. kannst du diesen genaueren wert bestätigen?
Das kommt ungefähr hin. Ich habe etwa 50 Cent pro Runde ausgerechnet.
Wieso etwa?
3.50? pro Würfel als Erwartungswert, mal 3 ist 10.50?^^
Beziehungsweise mein Programm:
Code:
int main(void)
{
double a = 1 + 2 +3 + 4 + 5 + 6;
a /= 6;
if((10 / 3) < a)
{
cout << "Spieler 2 ist im Vorteil" << endl;
}
else
{
cout << "Spieler 1 ist im Vorteil" << endl;
}
cin >> a;
}
Gehört also zu Fragestellung 2,
auch wenn's n bisschen geschummelt ist^^