Wahrscheinlichkeit v. versch. wahrsch. Ereignissen

Von: , Frage gestellt am Mi, 3. Sep 2008

Hallo!

Ich möchte die Wahrscheinlichkeit berechnen, wie Karten aus einem Kartenspiel kommen (Das brauch ich um ein BlackJack-Programm zu schreiben ;) ). Ich erklär euch am besten erst mal was ich bisher habe:

So berechne ich die Zufallskarte:

int Zufall()
{
srand (time(NULL));
zufallszahl = rand()%14;
}

Erklärung:
Damit wird eine Zahl zwischen 1 und 14 geliefert. Jede Zahl steht für eine Karte und jede Karte steht für einen Zahlenwert, z.B:
1,Eins,1;
14,Ass,11;
12,Dame,10;

Danach soll die Bank eine Karte bekommen. Da ist auch schon das Problem: Wie mache ich dem Programm verständlich, dass jetzt eine Karte weniger im Spiel ist, und er die Wahrscheinlichkeit anders berechnen muss, weil eben diese Karte fehlt?

Leider hilft Google nicht weiter...

Mir kam der Gedanke, dass man das Programm aufwändiger schreiben müsste, so dass man Rand() die Menge aller Ereignisse, die als Zufallszahl in Frage kommen vorgeben müsste und dann, wenn eine Zahl eines gewissen Ereignisses gezogen wurde, vor das Ereignis *3/4 nehmen, um auszudrücken, das es *3/4 so viel wahrscheinlicher wurde.

Vielen Dank schon mal,
Matthias

4 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: Wahrscheinlichkeit v. versch. wahrsch. Ereigni

    Hallo,

    int Zufall()
    {
    srand (time(NULL));
    zufallszahl = rand()%14;
    }
    

    Damit ist der Wert zwischen 0 und 13 Erklärung:
    Damit wird eine Zahl zwischen 1 und 14 geliefert.
    Falsch. Danach soll die Bank eine Karte bekommen. Da ist auch schon
    das Problem: Wie mache ich dem Programm verständlich, dass
    jetzt eine Karte weniger im Spiel ist, und er die
    Wahrscheinlichkeit anders berechnen muss, weil eben diese
    Karte fehlt?
    Das vermutlich einfachste ist, erst alle Karten zu mischen und dann auszuteilen - wie im richtigen Leben auch.
    Zum Mischen verwendet man üblicherweise das hier:
    http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

    HTH,
    Moritz

    • Antwort von nach 3 Stunden 0 hilfreich
      Re^2: Wahrscheinlichkeit v. versch. wahrsch. Ereig

      Hi :) Das vermutlich einfachste ist, erst alle Karten zu mischen und
      dann auszuteilen - wie im richtigen Leben auch.
      Zum Mischen verwendet man üblicherweise das hier:
      http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
      Danke für den Tipp mit dem Mischen! Klappt wirklich super, auch wenn mir der Link nicht so viel gebracht hat^^
      Aber das mit dem Mischen ist eine tolle Idee ;)
      Danke
      Matthias

      P.S. für alle die den Code haben wollen:

      int Mischen()
      {
      for(i=0; i<52; i++)
      {
      feld[i]=i;
      }
      for(i=0; i<51; i++)
      {
      int j,temp;
      j=i + rand() % (52-i);
      temp=feld[i];
      feld[i]=feld[j];
      feld[j]=temp;
      }
      }

  2. Antwort von nach 3 Tagen 0 hilfreich
    Noch eine Frage!

    Hallo!

    Ich habe leider noch eine Frage zu dem Programm:
    Ich habe jetzt folgenden Code um die Spielkarten zu mischen:

    int Mischen()
    {
    int i;
    for(i=0; i<32; i++)
    {
    Spielkarten[i]=i;
    }
    srand( time(NULL) );
    for(i=0; i<32; i++)
    {
    int j,temp;
    j=i + rand() % (31-i);
    temp=Spielkarten[i];
    Spielkarten[i]=Spielkarten[j];
    Spielkarten[j]=temp;
    }
    }

    Und so werden sie an Spieler 1 ausgeteilt:

    int Austeilen()
    {
    cout << "Die Karten werden gemischt und ausgeteilt! Du hast folgende Karten: " << endl
    << Spielkarten[1] << " " << Spielkarten[2] << " " << Spielkarten[3] << " "
    << Spielkarten[4] << " " << Spielkarten[5] << " " << Spielkarten[6] << " "
    << Spielkarten[7] << " " << Spielkarten[8] << endl;
    }

    Wenn ich das ganze jetzt ausführe, zeigt der PC aber immer nur an, dass ich 8 mal die Null als Karte habe.
    Warum macht er das? (Jetzt versteh ich erst, was alle meinen, wie dumm Syntaxfehler sind, ...)
    Danke jetzt schon mal!
    matze

    • Antwort von nach 5 Tagen 0 hilfreich
      Re: Noch eine Frage!

      Hi, Hallo!

      Ich habe leider noch eine Frage zu dem Programm:
      Ich habe jetzt folgenden Code um die Spielkarten zu mischen:
      Lass Dir im Debugger mal anzeigen, wie Du die Karten mischst. Dir wird auffallen, dass due letzte Karte immer stehen bleibt, weil es keine Karte mit höherem Index gibt, mit der getauscht werden kann.

      Außerdem hast Du in deinem Quelltext einen kleinen Fehler mit dem Laufindex i. Der darf natürlich nur bis (einschließlich) 30 gehen, weil Du sonst eni Problem mit der Moduloanweisung bekommst (Div/0).
      int Mischen()
      {
      int i;
      for(i=0; i<32; i++)
      {
      Spielkarten[i]=i;
      }
      srand( time(NULL) );
      for(i=0; i<32; i++)
      {
      int j,temp;
      j=i + rand() % (31-i);
      temp=Spielkarten[i];
      Spielkarten[i]=Spielkarten[j];
      Spielkarten[j]=temp;
      }
      }

      Und so werden sie an Spieler 1 ausgeteilt:

      int Austeilen()
      {
      cout << "Die Karten werden gemischt und ausgeteilt!
      Du hast folgende Karten: " << endl
      << Spielkarten[1] << " " <<
      Spielkarten[2] << " " << Spielkarten[3] <<
      " "
      << Spielkarten[4] << " " <<
      Spielkarten[5] << " " << Spielkarten[6] << "
      "
      << Spielkarten[7] << " " <<
      Spielkarten[8] << endl;
      }

      Wenn ich das ganze jetzt ausführe, zeigt der PC aber immer nur
      an, dass ich 8 mal die Null als Karte habe.
      Warum macht er das? (Jetzt versteh ich erst, was alle meinen,
      wie dumm Syntaxfehler sind, ...)
      Danke jetzt schon mal!
      matze
      Bei mir taucht dieses Problem nicht auf, aber vielleicht hilft Dir dabei auch der Debugger.

      Gruß Yelmalio

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!