From 32072c05c8d1a41145702bacbefba6695df04b73 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Thu, 5 Jan 2017 22:45:25 +1300 Subject: Add Monty Hall simulator --- .gitignore | 1 + monty/Makefile | 1 + monty/monty.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 monty/Makefile create mode 100644 monty/monty.c diff --git a/.gitignore b/.gitignore index 7622e04..4db000d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ words-misc/match_pool +monty/monty *.o diff --git a/monty/Makefile b/monty/Makefile new file mode 100644 index 0000000..aa5f1de --- /dev/null +++ b/monty/Makefile @@ -0,0 +1 @@ +monty: diff --git a/monty/monty.c b/monty/monty.c new file mode 100644 index 0000000..13ab236 --- /dev/null +++ b/monty/monty.c @@ -0,0 +1,79 @@ + + +#include +#include +#include + + +enum Strategy { + STRATEGY_STICK, + STRATEGY_CHANGE +}; + + +unsigned int monty(int door_count, unsigned long plays, enum Strategy strategy) +{ + unsigned int i = 0; + int door = 0; + unsigned int wins = 0; + int prize = -1; + int choice = -1; + int remain = -1; + + for (i = 0; i < plays; i++) { + prize = rand() % door_count; + choice = rand() % door_count; + + /* Monty shall open all doors except two; the contestant's choice + * and pick one door to not open */ + if (choice == prize) { + /* contestant was originally correct? Pick any other door aside + * from their choice to remain. Crude loop strategy, but pseudo- + * randomness should help ensure quick termination */ + do { + remain = rand() % door_count; + } while (remain == choice); + } else { + /* contestant never originally picked prize door; the prize door + * remains */ + remain = prize; + } + + switch (strategy) { + case STRATEGY_STICK: + /* stick with current door */ + break; + case STRATEGY_CHANGE: + /* `change` strategy: switch to remaining door */ + choice = remain; + break; + default: + return -1; + } + if (choice == prize) + wins++; + } + return wins; +} + + +int main() +{ + double ratio = 0; + int runs = 1000000; + int wins = 0; + + srand(time(NULL)); + + /* "stick/stay/lazy" strategy */ + wins = monty(3, runs, STRATEGY_STICK); + ratio = ((double)wins) / runs; + printf("Stick : Won %d of %d (%.5f) success\n", wins, runs, ratio); + + /* "change" strategy */ + wins = monty(3, runs, STRATEGY_CHANGE); + ratio = ((double)wins) / runs; + printf("Change: Won %d of %d (%.5f) success\n", wins, runs, ratio); + + return 0; +} -- cgit v1.1