Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Klatsch und Tratsch (https://www.delphipraxis.net/34-klatsch-und-tratsch/)
-   -   [Mathematik] Wahrscheinlichkeitsrechnung für Karten (https://www.delphipraxis.net/165830-%5Bmathematik%5D-wahrscheinlichkeitsrechnung-fuer-karten.html)

Codewalker 18. Jan 2012 11:30

[Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Ich hoffe hier mal auf den Querdenkerfaktor von Programmierern bei einem Wahrscheinlichkeitsproblem.

Angenommen: Ich habe ein Kartenspiel mit den Karten von 1 bis 13 und zwei Joker (zählen als 0). Ich ziehe am Anfang 5 Karten. Ich lege dann nacheinander eine beliebige Karte aus meiner Hand aus und ziehe eine neue nach.

Frage: Wie groß ist die Wahrscheinlichkeit, dass ich eine Starthand (+ Nachziehkarten) erhalte, mit denen ich die Summe 26 legen kann?

Die Joker mal ausgenommen, komme ich auf 2^13 = 8192 Kartenkombinationen. Dabei sind 782 <= 26 und 95 genau gleich 26. Im Schnitt bestehen die Lösungskombinationen aus 4,34 Karten (also ziehe ich im Spiel 4,34 Karten nach).

Wie kriege ich jetzt raus, wieviele Kartenhände (oder mit welcher Wahrscheinlichkeit + Nachziehkarten) es gibt, mit denen ich eine 26er-Kombination (also Gewinnstrategie) haben kann? (am liebsten in Excel zum ausprobieren)

Edit: Es ist gerade noch eben komplizierter als ich gedacht habe :mrgreen:

Jumpy 18. Jan 2012 14:19

AW: [Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Das klingt ja nach Kombinatorik. Welches Modell verwendest du denn, dass du auf die 2^13 Kobinationen kommst? Muss da nicht irgendwo auch mal die 5 auftauchen, wenn du doch 5 Karten auf der Hand hast?

Wie oft ziehst du nach?

In deiner Beschreibung klingt dass so, als ob du blind Karten abwirst und nachziehst. Somit sollte im Modell das Nachziehen doch egal sein bzw. dasselbe sein wie "ich ziehe 5 Karten aus 13(15) ohne zurücklegen".

Codewalker 18. Jan 2012 14:33

AW: [Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Die 2^13 war folgendes:

Ich habe ja am Ende eine Reihe von Karten auf dem Tisch liegen mit Werten, die in Summe 26 ergeben. Ich wollte wissen, wie viele Kombinationen aus allen möglichen Kombinationen die Summe 26 ergeben. Wenn ich die Joker weglasse kann man eine Tabelle aufstellen in der alle Kombinationen stehen. Das sind in Summe 8192 Stück (quasi wie eine Entscheidungstabelle, nur mit Summen drin). Das Problem ist, dass da die Joker nicht berücksichtigt werden.

Mein Problem ist, dass mir die Einbeziehung von 3 Dingen fehlt
  1. Die 5 Starthandkarten
  2. Die 2 Joker
  3. Die nachgezogenen Karten
Für jede ausgelegte Karte ziehe ich genau eine Karte nach, so dass im immer 5 Karten auf der Hand habe. Ich lege so lange Karten, bis die Summe 26 ergibt (falls möglich). Ich weiß also vor Beginn nicht, wie viele Karten ich lege und damit auch nachziehe.

Und zu den Jokern hab ich noch was vergessen: Die Joker haben keinen Wert und belegen damit erstmal nur Platz auf der Hand. Ich muss aber wenn ich die letzte Karte gelegt habe (und die Summe 26 erreicht habe) am Ende mindestens einen Joker auf der Hand habe, um zu gewinnen.
(kann man sowas überhaupt ausrechnen? So langsam kommen mir da Zweifel)

Namenloser 18. Jan 2012 15:00

AW: [Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Wie viele Karten gibt es denn insgesamt? Gibt es insgesamt nur 13+2 Karten, oder gibt es Karten doppelt?

Also ich habe erst mal eine einfachere Variante ausgerechnet: Wie hoch ist die Wahrscheinlichkeit, dass man beim Ziehen von 5 Karten eine Summe von 26 legen kann? Dabei ist die Reihenfolge nicht berücksichtigt, d.h. die Karten werden alle in einem Rutsch gezogen, was der Startsituation entspricht.

Code:
# ruby
def calculatePropability(cards, n, remaining_sum)
  if (n <= 0) || (cards.empty?)
    return 0.0
  end

  propability = 0.0;

  cards.each_with_index do |card, index|
    # set of remaining cards
    new_cards = cards.clone;
    new_cards.delete_at(index);

    new_remaining_sum = remaining_sum - card;

    # we have won the game
    if new_remaining_sum == 0
      item_propability = 1.0
    # we have lost the game
    elsif new_remaining_sum < 0
      item_propability = 0.0
    else
      item_propability = calculatePropability(new_cards, n-1, new_remaining_sum);
    end

    # add up partial propabilities
    propability += (1.0/cards.count)*item_propability;
  end

  return propability;
end

cards = (1..13).to_a + [0,0]; # cards from 1 to 13, 2 jokers
n = 5;
sum = 26;

puts calculatePropability(cards, n, sum);
Nichts großartiges...

Die ausgegebene Wahrscheinlichkeit ist hier ungefähr 11.18%.

Wie gesagt, das Nachziehen ist nicht berücksichtigt, es wird nur ausgegeben, wie hoch die Wahrscheinlichkeit mit den 5 Start-Karten ist. Über das Nachziehen muss ich noch mal genauer nachdenken. Aber vielleicht ist der Algorithmus schon mal ein Ansatz...

Ich glaube, dass es letztendlich aber keine andere Berechnungsmöglichkeit gibt, als alle Möglichkeiten durchzuiterieren, sprich Bruteforce.

Codewalker 18. Jan 2012 15:02

AW: [Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Zitat:

Zitat von NamenLozer (Beitrag 1146510)
Wie viele Karten gibt es denn insgesamt? Gibt es insgesamt nur 13+2 Karten, oder gibt es Karten doppelt?

13+2 ist richtig. Es gibt keine doppelten Karten.

Zitat:

Zitat von NamenLozer (Beitrag 1146510)
Ich glaube, dass es letztendlich aber keine andere Berechnungsmöglichkeit gibt, als alle Möglichkeiten durchzuiterieren, sprich Bruteforce.

Ich hoffe nicht :pale:

Und ja, der Algorithmus ist schonmal ein Anfang (auch wenn mein Ruby eingerostet ist)

Namenloser 18. Jan 2012 16:40

AW: [Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Ich hab mir noch was überlegt, um die Anzahl der möglichen Züge für eine verbleibende Anzahl von Karten auf dem Stapel auszurechnen:
Code:
def calculatePossibilities(hand_count, stack_count)
  if stack_count <= 0
    # number of possible cards to play: hand_count
    hand_count
  else
    # number of possible cards to pick from stack: stack_count
    # number of possible cards to play: hand_count
    # remaining number of moves: calculatePossibilities(hand_count, stack_count-1)
    stack_count*hand_count*calculatePossibilities(hand_count, stack_count-1)
  end
end

puts calculatePossibilities(5, 13+2-5);
hand_count ist dabei einfach eine Konstante, die angibt wie viele Karten man in der Hand hält (5).

Hoffe ich hab da jetzt keinen Denkfehler. Damit ergeben sich 1.77×10¹⁴ mögliche Spielzüge.

Nur, wie man die beiden Ergebnisse jetzt verknüpft, bzw. ob man sie überhaupt verknüpfen kann, oder ob mein Ansatz kompletter murks ist, damit bin ich überfragt. Ich geb’s an dieser Stelle daher einfach mal auf... aber angefixt hast du mich.

Fände es sehr interessant, wenn jemand, der von Mathe mehr Ahnung hat als ich, hier doch noch eine Lösung postet.

Codewalker 22. Jan 2012 10:29

AW: [Mathematik] Wahrscheinlichkeitsrechnung für Karten
 
Also, kurzes Update, zumindest zur Theorie:

Um die Anzahl der Permutationen zu reduzieren, kann man folgendes nutzen:
  • Die Reihenfolge der ersten 5 Handkarten ist irrelevant
  • Beide Gewinnkarten sind identisch zu behandeln (mach aus 15! schonmal 15!/2)
  • Nach maximal 6 Karten muss die Summe 26 genau erreicht sein. Es gibt keine Kartenkombination mit >6 Karten, die Summe 26 ergibt

Man müsste also alle Permutationen aufzählen, wobei die ersten 5 Elemente zu sortieren sind.
Dann sind es in Summe (nur :lol:) (15 über 5) * 10! = 10897286400
Immer noch viel, aber weniger als anfangs gedacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz