From 44ef79a786adc3021d85b96eed46ba60fb4baeda Mon Sep 17 00:00:00 2001 From: Peter Norvig Date: Sun, 31 Mar 2019 10:11:28 -0700 Subject: [PATCH] Add files via upload --- ipynb/Dice Baseball.ipynb | 72 +++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/ipynb/Dice Baseball.ipynb b/ipynb/Dice Baseball.ipynb index 2299ffd..9f0a0a7 100644 --- a/ipynb/Dice Baseball.ipynb +++ b/ipynb/Dice Baseball.ipynb @@ -14,20 +14,20 @@ "* On an \"out at first\", all runners advance one base.\n", "* On a double play, the runner on first is out if there is one, otherwise a runner on second, otherwise a runner on third, otherwise it is only a single out.\n", "* On a fly out, a runner on third scores; other runners do not advance.\n", - "* On an error all runners advance one base. (*Note: in an earlier version, I treated an error as a single, meaning that a runner would score from second on an error which seems wrong. Under that interpretation, teams score about 0.1 runs more per game.*)\n", + "* On an error all runners advance one base. (*Note: in an earlier version, I treated an error as a single, meaning that a runner would score from second on an error, which seems wrong. Under that interpretation, teams score about 0.05 runs more per game.*)\n", "\n", "I also made some choices about the implementation:\n", - "- I wanted to have one event per batter, so I don't allow \"strike\" as an event. Rather I compute the probability of a strikeout event (i.e. getting three \"strike\" outcomes in a row before getting another event) as `(7/36)**3 = 0.007351680384`, and check for that.\n", - "- Note that a die roll such as (1, 1) is a 1/36 event, whereas (1, 2) is a 2/36 event.\n", + "- I wanted to have one event per batter, so I don't allow \"strike\" as an event. Rather I compute the probability of a strikeout event (i.e. getting three \"strike\" dice rolls in a row before getting another event) as `(7/36)**3`, and check for that.\n", + "- Note that a die roll such as (1, 1) is a 1/36 event, whereas (1, 2) is a 2/36 event, because it is also (2, 1).\n", "- I'll represent events with the following one letter codes:\n", " - `K`, `O`, `o`, `f`, `D`: strikeout, foul out, out at first, fly out, double play\n", " - `1`, `2`, `3`, `4`: single, double, triple, home run\n", " - `E`, `B`: error, base on balls\n", "- I'll keep track of runners with a list of occupied bases; `runners = [1, 2]` means runners on first and second.\n", "- A runner who advances to base 4 or higher has scored a run (unless there are already 3 outs).\n", - "- The function `inning` simulates a (half) inning and returns the number of runs scored.\n", + "- The function `inning` simulates a half inning and returns the number of runs scored.\n", "- I'll run the simulation 1 million times and store the resulting scores in `innings`.\n", - "- To simulate a game I just sample 9 elements of `innings`." + "- To simulate a game I just sample 9 elements of `innings` and sum them." ] }, { @@ -47,10 +47,10 @@ "metadata": {}, "outputs": [], "source": [ - "def inning(events='2111111EEBBOOooooooofffffD334', strikes=7, verbose=False):\n", + "def inning(events='2111111EEBBOOooooooofffffD334', strikes=7, verbose=False) -> int:\n", " \"Simulate a random inning and return number of runs scored.\"\n", - " E = len(events) + strikes # With 2 dice, E = 36\n", - " PK = (strikes / E) ** 3 # The probability of a strikeout\n", + " n = len(events) + strikes # With 2 dice, n = 36\n", + " PK = (strikes / n) ** 3 # The probability of a strikeout\n", " outs = runs = 0 # Inning starts with no outs and no runs,\n", " runners = [] # ... and with nobody on base\n", " while True:\n", @@ -64,8 +64,8 @@ " elif x == 'o': # out at first (other runners advance)\n", " runners = [r+1 for r in runners]\n", " elif x == 'f' and 3 in runners: # fly out; runner on 3rd scores\n", - " runs += 1\n", " runners.remove(3)\n", + " runs += 1\n", " else: # batter reaches base safely\n", " runners.append(0)\n", " if x in '1234': # single, double, triple, homer\n", @@ -73,7 +73,7 @@ " elif x == 'E': # error\n", " runners = [r + 1 for r in runners]\n", " elif x == 'B': # base on balls\n", - " runners = [(r+1 if r==0 or r-1 in runners else r) for r in runners]\n", + " runners = [r + all(b in runners for b in range(r)) for r in runners]\n", " if outs >= 3:\n", " return runs\n", " else: # See if anybody scored\n", @@ -97,18 +97,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "outs: 0, runs: 0, runners: [], event: E\n", - "outs: 0, runs: 0, runners: [1], event: o\n", - "outs: 1, runs: 0, runners: [2], event: 4\n", - "outs: 1, runs: 2, runners: [], event: O\n", - "outs: 2, runs: 2, runners: [], event: 1\n", - "outs: 2, runs: 2, runners: [1], event: f\n" + "outs: 0, runs: 0, runners: [], event: 4\n", + "outs: 0, runs: 1, runners: [], event: E\n", + "outs: 0, runs: 1, runners: [1], event: 1\n", + "outs: 0, runs: 1, runners: [2, 1], event: 4\n", + "outs: 0, runs: 4, runners: [], event: 3\n", + "outs: 0, runs: 4, runners: [3], event: o\n", + "outs: 1, runs: 5, runners: [], event: o\n", + "outs: 2, runs: 5, runners: [], event: f\n" ] }, { "data": { "text/plain": [ - "2" + "5" ] }, "execution_count": 3, @@ -130,11 +132,11 @@ "output_type": "stream", "text": [ "outs: 0, runs: 0, runners: [], event: o\n", - "outs: 1, runs: 0, runners: [], event: O\n", - "outs: 2, runs: 0, runners: [], event: B\n", - "outs: 2, runs: 0, runners: [1], event: 4\n", - "outs: 2, runs: 2, runners: [], event: B\n", - "outs: 2, runs: 2, runners: [1], event: o\n" + "outs: 1, runs: 0, runners: [], event: D\n", + "outs: 2, runs: 0, runners: [], event: 1\n", + "outs: 2, runs: 0, runners: [1], event: E\n", + "outs: 2, runs: 0, runners: [2, 1], event: 3\n", + "outs: 2, runs: 2, runners: [3], event: o\n" ] }, { @@ -161,22 +163,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "outs: 0, runs: 0, runners: [], event: 2\n", - "outs: 0, runs: 0, runners: [2], event: 1\n", - "outs: 0, runs: 1, runners: [1], event: o\n", - "outs: 1, runs: 1, runners: [2], event: O\n", - "outs: 2, runs: 1, runners: [2], event: 1\n", - "outs: 2, runs: 2, runners: [1], event: B\n", - "outs: 2, runs: 2, runners: [2, 1], event: E\n", - "outs: 2, runs: 2, runners: [3, 2, 1], event: B\n", - "outs: 2, runs: 3, runners: [3, 2, 1], event: 4\n", - "outs: 2, runs: 7, runners: [], event: O\n" + "outs: 0, runs: 0, runners: [], event: f\n", + "outs: 1, runs: 0, runners: [], event: 1\n", + "outs: 1, runs: 0, runners: [1], event: B\n", + "outs: 1, runs: 0, runners: [2, 1], event: B\n", + "outs: 1, runs: 0, runners: [3, 2, 1], event: 1\n", + "outs: 1, runs: 2, runners: [2, 1], event: 3\n", + "outs: 1, runs: 4, runners: [3], event: o\n", + "outs: 2, runs: 5, runners: [], event: K\n" ] }, { "data": { "text/plain": [ - "7" + "5" ] }, "execution_count": 5, @@ -212,7 +212,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, display a histogram and the mean number of runs scored per team per nine-inning game:" + "Finally, display the mean number of runs scored per team per nine-inning game, along with a histogram:" ] }, { @@ -223,7 +223,7 @@ { "data": { "text/plain": [ - "14.960244" + "14.959092" ] }, "execution_count": 7, @@ -232,7 +232,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ]