Author: Ricardo Gibert
Date: 01:13:14 07/25/03
Go up one level in this thread
On July 24, 2003 at 23:46:50, Tom Kerrigan wrote:
>Given a round robin tournament with 13 participants of equal strength, 5 of
>which are The King:
>
>There's a 14% chance The King would take the top 3 spots.
>
>There's an 11.4% chance of a specific program winning the tournament. (This
>problem is apparently more complex than it seems--I would have guessed a
>1/13=7.6% chance of any given program winning the tournament.)
Complex? You merely forgot that there can be a tie for first too.
>
>In other words, you should only be slightly less surprised that The King took
>the top 3 spots than if a certain program won a tournament against 12 other
>programs of the same strength. In other words again, it's unlikely that The King
>is the same strength as the other programs.
>
>Just an experiment: if you lower Ktulu's rating by 200 points and Crafty's
>rating by 100 points and increase Shredder's rating by 50 points and The King's
>rating by 25 points, The King has a 23.3% chance of taking the top 3 spots...
>not THAT unlikely...
>
>-Tom
>
>
>#include <stdio.h>
>#include <memory.h>
>#include <stdlib.h>
>#include <time.h>
>#include <math.h>
>
>//#define DEBUG
>
>#define PROGS 13
>
>char *program[PROGS] = {
> "The King 3.23D",
> "CM9000 Grailmaster7",
> "The King 3.23M2v.5",
> "The King 3.23 WHx",
> "The King 3.23SKR",
> "Junior 8",
> "Fritz 8",
> "Ruffian 1.0.5",
> "Crafty 19.03 B",
> "DeepSjeng 1.5",
> "Chess Tiger 14.0",
> "Shredder 7",
> "Ktulu 3.7"
>};
>
>int rating[PROGS] = {
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400,
> 2400
>};
>
>int points[PROGS];
>
>int place[PROGS];
>int next_place;
>int ignore[PROGS];
>
>int result(int r1, int r2)
>{
> double p;
> int r;
>
> p = (double)(r2 - r1);
> p /= 400.0;
> p = pow(10.0, p);
> p += 1.0;
> p = 1.0 / p;
> p *= 100.0;
> r = rand() % 101;
> if (r < (int)p)
> r = 2;
> else if (r == (int)p)
> r = 1;
> else
> r = 0;
>#ifdef DEBUG
> printf("%d vs. %d, winning percentage %f, r: %d\n", r1, r2, p, r);
>#endif
> return r;
>}
>
>void sort()
>{
> int i, old_place, best_score = -1;
>
> for (i = 0; i < PROGS; ++i) {
> if (ignore[i]) continue;
> if (points[i] > best_score)
> best_score = points[i];
> }
> old_place = next_place;
> for (i = 0; i < PROGS; ++i)
> if (points[i] == best_score) {
> place[i] = old_place;
> ignore[i] = 1;
> ++next_place;
> }
>}
>
>int tourney()
>{
> int i, j;
>
> memset(points, 0, sizeof(points));
> for (i = 0; i < PROGS; ++i)
> for (j = i + 1; j < PROGS; ++j)
> switch (result(rating[i], rating[j])) {
> case 0: points[j] += 2; break;
> case 1: points[i] += 1; points[j] += 1; break;
> case 2: points[i] += 2; break;
> }
> next_place = 0;
> memset(ignore, 0, sizeof(ignore));
> for (i = 0; i < PROGS; ++i)
> sort();
>#ifdef DEBUG
> for (i = 0; i < PROGS; ++i) {
> printf("place: %2d, points: %.1f, program: %s, rating: %d\n",
> place[i],
> (float)points[i] / 2.0,
> program[i],
> rating[i]);
> }
> getc(stdin);
>#endif
>
> int top_three = 0;
> for (i = 0; i < 5; ++i)
> if (place[i] <= 2)
> ++top_three;
> if (top_three >= 3)
> return 1;
> return 0;
>}
>
>void main()
>{
> int i, tourneys, t;
>
> srand(time(NULL));
> for (tourneys = 1000; ; tourneys *= 2) {
> t = 0;
> for (i = 0; i < tourneys; ++i)
> t += tourney();
> printf("tourney() returned 1: %d out of %d times, %f percent\n", t, i,
> ((float)t / (float)i) * 100.0);
> }
>}
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.