/*************************************************** wbsatz.c Satzlängen bei Wasser-Ball-Über-Die-Schnur berechnen von Haxe www.pansensack.de ***************************************************/ #include #include #include struct ergebnis { int ballwechsel; int punkte[2]; }; struct ergebnis *satz(void); int boolrand(void); /* Hauptprogramm */ int main(void) { int max=0; double count=0, sum=0; struct ergebnis *current; printf("wbsatz 1.0 - Spielt zufällige Sätze für " "Wasser-Ball-Über-Die-Schnur.\n\n"); srand(time(0)); /* init */ while(1) { /* immer wieder... */ count++; current = satz(); /* einen Satz spielen... */ sum += current->ballwechsel; /* und das Ergebnis auswerten */ if (current->ballwechsel > max) { max = current->ballwechsel; printf("Neuer Rekordsatz mit %i Ballwechseln " "(bisheriger Durchschnitt: %f)\n" "nach Berechnung von insgesamt %.0f Sätzen. " "Endstand: %i zu %i\n\n", current->ballwechsel, sum/count, count, current->punkte[0], current->punkte[1]); } } return(0); /* Ende, kommt aber nicht vor :-) */ } /* Zufälligen Satz berechnen und Ergebnis zurückgeben */ struct ergebnis *satz(void) { int angeber=0, winner, diff; static struct ergebnis this; int *p = this.punkte; this.ballwechsel = 0; /* Alles auf null */ p[0] = p[1] = 0; do { this.ballwechsel++; winner = boolrand(); if (winner == angeber) p[winner]++; angeber = winner; if ((p[winner] == 4) && (p[0] * p[1] == 0)) /* Kurzsatz */ break; diff = p[0] - p[1]; } while ((diff*diff < 4) || (p[winner] < 8)); /* Abbruch bei 8 und Tiebreak */ return(&this); } /* Boolesche Zufallszahl Die Güte der Zufallszahl ist systemabhängig. Bei Versuchen unter Windows (Visual C++) gab es auf diese Weise bis zu 72 Ballwechsel, unter Linux (glibc) bis zu 115 Ballwechsel. Wer es noch weiter treiben will, muss an dieser Stelle einen besseren Zufi verwenden. */ int boolrand(void) { return (rand() & 1); }