Zufall + while

Sycoran

Grünschnabel
Hallo, ich bin gerade dabei, ein Spiel zu entwickeln und versuche nun, um alles auszubalancieren, etwas zu schreiben, was mir die Wahrscheinlichkeiten für Sieg oder Niederlage eines Kampfes anzeigt. Das ist das erste Mal, dass ich überhaupt was mit c erstelle und hab mich durch eine Menge Probleme selber gekämpft, aber hier komme ich nicht weiter:

Ich lasse zwei Würfel durch eine random funktion + zeit würfeln. Das funktioniert und die Würfelergebnisse sind verschieden. Wenn ich das Ganze dann aber durch eine while() funktion
20 mal durchlaufen lasse, sind alle Würfel1-ergebnisse gleich und alle Würfel2-ergebnisse ebenso.
Liegt es daran, dass das Ganze so schnell durchläuft, dass die Zeit bei den Würfen die gleiche ist? Wie kann ich dass Problem beheben?

Ich poste mal alles, da ich nicht weiss, wo der Fehler liegt:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()

{
int g; /*gewonnen*/
int v; /*verloren*/
int x;
x=1; /*Schleifenvariable*/
g=0;
v=0;
while(x<20)
{
x=x+1;
int r; /*Würfelergebnis 1*/
int s; /*Würfelergebnis 2*/
int a; /*Einheit 1*/
int b; /*Einheit 2*/
int i;
time_t t;

time(&t);
srand((unsigned int)t); /* Zufallsgenerator initialisieren */
a=4;
b=4;

printf("\n Einheit 1 = %d",a);
printf("\n Einheit 2 = %d",b);


for ( i=0; i<1; i++ );
r=rand() % 6 + 1; /* Wuerfeln 1*/
printf("\n Wuerfel Einheit 1 = %d",r); /*Ergebnis*/

for ( i=0; i<1; i++ );
s=rand() % 6 + 1; /* Wuerfeln 2*/
printf("\n Wuerfel Einheit 2 = %d",s); /*Ergebnis*/


/*jetzt werden die Einheiten gekillt*/

if (r>s)
{
b=b-1;
printf("\nEinheit 2 wird gekillt");
g=g+1;
}

if (s>r)
{
v=v+1;
printf("\nEinheit 2 wird nicht gekillt");
}

/*Lebenspunkte werden angezeigt*/
printf("\n Einheit 1 = %d",a);
printf("\n Einheit 2 = %d",b);


} /*ende der while funktion*/
printf("\nGewonnen = %d",g);
printf("\nVerloren = %d",v);
getchar();
}



Ach ja, wie gesagt, das hier ist mein erster Kontakt, ich würde mich freuen, eine ausführliche Erklärung zu bekommen, da ich mittlerweise von der Sache fasziniert
bin und gerne verstehen möchte.
 
So funktionierts:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int g = 0, v = 0; 
	int r, s, a, b, i;

	time_t t;
	time(&t);
	srand((unsigned int)t);

	for (int x = 0; x < 20; x++)
	{
		a = 4; // wofür ist das gut?
		b = 4;

		printf("\n Einheit 1 = %d", a);
		printf("\n Einheit 2 = %d", b);

		r = rand() % 6 + 1;
		printf("\n Wuerfel Einheit 1 = %d", r);

		s = rand() % 6 + 1;
		printf("\n Wuerfel Einheit 2 = %d", s);

		if (r > s)
		{
			b--;
			printf("\nEinheit 2 wird gekillt");
			g++;
		}
		else if (s > r)
		{
			v++;
			printf("\nEinheit 2 wird nicht gekillt");
		}

		printf("\n Einheit 1 = %d", a);
		printf("\n Einheit 2 = %d", b);
	}

	printf("\nGewonnen = %d", g);
	printf("\nVerloren = %d", v);
	getchar();
}

Du initialisierst bei jedem Schleifendurchgang den Zufallsgenerator neu, das war dein Fehler. Es reicht aus, diesem einmal die Zeit nach dem Programmstart zu füttern. Ab diesem Moment dann erzeugt er Zufallszahlen.
Ich hab mir erlaubt, etwas aufzuräumen... auf alle Fälle würde ich dir empfehlen, bessere Variablennamen zu nehmen, weil ich mir sicher bin, dass es nicht mehr lange dauert, bis du nicht mehr weißt, was in dem Code eigentlich passiert. :)
 
Zuletzt bearbeitet:
Fantastisch es funktioniert. Vielen Dank für die Hilfe und die Erklärung.
Die Variablen a und b geben die Anzahl der Kämpfer in der Einheit an, welche im weiteren Verlauf noch gebraucht wird
 
@engelmarkus:
C++:
time_t t;
time(&t);
srand((unsigned int)t);
=>
C++:
srand((unsigned)time(NULL));
 
Zurück