Problem mit Zufallszahlen



  • Hallo

    Also, ich habe folgendes Problem: Ich habe ein kleines Spiel geschrieben in dem man mit 15 anderen Teams in einer Liga spielt. Dabei finden an einem "Spieltag" 8 Spiele mit je 2 Teams statt. Das Spiel des eigenen Teams wird dabei "kommentiert", während die anderen Spiele einfach schnell durchgerechnet werden und nur das Endergebnis ausgegeben wird.

    Jetzt das Problem:
    Das Ergebnis des eigenen Teams fällt eigentlich so aus wie ich es erhofft habe. Also sehr zufällig (natürlich in gewisser Abhängigkeit von der Stärke der Spieler). Aber die restlichen Ergebnisse sind immer sehr einseitig. So gehen zB 50% der Spiele 0:0 aus und die anderen 10:0 oder 19:0 etc.
    Ich glaube das hängt mit einer Funktion zusammen bei der mit Hilfe von Zufallszahlen den Sieger eines Duells zwischen 2 Spielern berechnet wird. Weil bei dem "kommentierten" Spiel künstliche Pausen eingebaut sind fallen die Zufallszahlen nicht alle gleich aus, während beim schnellen durchrechnen die Zufallszahlen (da durch Systemzeit generiert) sehr einseitig ausfallen, was dann zu den einseitigen Ergebnissen führt.

    So, hier erstmal die Funktion:

    int duell(int playerA, int playerB) {
    	srand((unsigned)time(NULL)); 
    	int rnd;
    	Sleep(playerA*10+playerB);		//mein Versuch künstl. Pausen einzubauen
    	rnd = rand() % (playerA + playerB);
    	if(rnd < playerA) return 1;			//Spieler A gewinnt
    	else return 2;					//Spieler B gewinnt
    };
    

    Kurze Erläuterung: playerA und playerB sind hierbei zwei Variablen für die jeweilige "Stärke" des Spielers.

    Leider waren meine bisherigen Versuche zB durch künstliche kurze Pausen den Zufall auf die Sprünge zu helfen und die Ergenisse etwas ausgefallener zu machen alle vergebens.
    Deswegen bitte ich euch um Hilfe, wie man dieses Problem denn lösen kann (bzw ob das denn wirklich mit dieser Zufallsfunktion zusammenhängt)

    Danke schonmal


  • Mod

    Ganz einfach: Führe srand nur einmal bei Programmstart aus! Danach nicht wieder! srand dient nur zum Initialsieren, aber Du initalisierst immer wieder auf einen konstanten Wert sodass natürlich immer wieder rand ein gleicher ergebnis liefert.



  • danke, hatte gehofft dass es so einfach ist 😃



  • Hallo,

    hab ein ähnliches Problem:

    Ich brauche für für ein Kartenspiel eine Mischmethode!
    Das genze funzt ganz prima, bis auf die Tatsache dass in jeder Runde immer die gleichen "Zufälle" entstehen!

    public: void mischen(){
    
    	 int spieler, p[4]={0};	
    	 Random zufall;
    
              for(int i=0;i<32;i++){
    	 spieler=(zufall.Next()%4);
    	 if(p[spieler]==7)
    	      i--;
              else
    	      p[spieler]=Gamer[spieler].setKarten(i);
    
    	 }
    	}
    

    Kann mir jmd aus dieser Misere helfen?
    Ich habe es auch schon mit der srand(time(NULL)) versucht, aber dann bekomm ich nen Compilerfehler, er kennt anscheinend "time" nicht!!!
    Was hab ich vergessen???

    Dank euch schonmal

    uwe



  • dittus.uwe schrieb:

    Was hab ich vergessen???

    Erstens den Quelltext der Random-Klasse zu posten - und zweitens vermutlich den Header <cstdlib>.


Log in to reply