summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2017-01-05 22:45:25 +1300
committerDavid Phillips <david@sighup.nz>2017-01-05 22:45:25 +1300
commit32072c05c8d1a41145702bacbefba6695df04b73 (patch)
tree3fb2153794239d2c83f7d42073b81b1b95528ae8
parentcc91c16f3e14b6bc36974c39891d8f8f7400a64d (diff)
downloadodds-and-ends-32072c05c8d1a41145702bacbefba6695df04b73.tar.xz
Add Monty Hall simulator
-rw-r--r--.gitignore1
-rw-r--r--monty/Makefile1
-rw-r--r--monty/monty.c79
3 files changed, 81 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+
+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;
+}