Shuffle Alogrithmus verstädnis frage



  • Hallo

    ich habe in einem Programm folgenden Shuffel Algorithmus:

    void SkatGame::shuffle() 
    { 
    	Card mem;
    	int pos;
    
    	for (int i = 0; i < 32; i++)
    		{
    			pos = rand()%32;
    			mem = deck[i];
    			deck[i] = deck[pos];
    			deck[pos] = mem;
    		}
    }
    
    void SkatGame::deal()
    {
    	int pos=0;
    	for (int i = 0; i < 10; i++)
    	{
    		player1[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player2[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		player3[i] = deck[pos];
    		pos++;
    	}
    
    	for (int i = 0; i < 2; i++)
    	{
    		skat[i] = deck[pos];
    		pos++;
    	}
    

    Dabei handelt es sich wie man sieht um Skat also ein Kartendeck. Leider ist mir nicht völlig klar, wie hier die doppelte ausgabe einer Karte verhindert wird? eine Position könnet doch mit rand()%32 tehoretisch auch zweimal angepsurngen werden und somit 2 Spielern die gleiche karte gegeben werden, oder? Denn die Karte an sich wird ja aus dem Array deck nicht entfernt.

    Eine Erklräung nahand des Codes wäre sehr nett, ich blicks einfach nicht.



  • das wird schlicht nicht verhindert. der code ist fehlerhaft.



  • der Code ist nicht fehlerhaft.

    die kArte wird ja nicht verdoppelt, sondern mit einer anderen vertauscht!

    mem = deck[i];        // Zwischenspeicher der Karte, die sich "noch" in deck[i] befindet
    deck[i] = deck[pos];  // deck[i] mit der Karte aus deck[pos] überschreiben
    deck[pos] = mem;      // in deck[pos] den alten Wert von deck[i] schreiben
    

    wie man sieht eine ganz simple Sache 😉



  • hm... aber es ist dann zumindest theoretisch möglich das eine Karte zweimal vertauscht wird, richtig? also es wird nicht jede karte zwangsweise einmal vertauscht? denn der wert von deck[pos] ist ja zufällig




Anmelden zum Antworten