Add files via upload

This commit is contained in:
Peter Norvig authored and GitHub committed 2020-05-15 17:17:36 -07:00
1 parent 1c257ce622
commit 501774ab53
2 files changed
+1168 -174

No files matched your search

+1066 -97
View File
File diff suppressed because it is too large. Load diff
+102 -77
View File
@@ -156,9 +156,9 @@
}
],
"source": [
"cards = range(2, 11)\n",
"\n",
"mean(map(guess_all, permutations(cards)))"
"cards = \"🃂🃃🃄🃅🃆🃇🃈🃉🃊\" # Use Unicode cards instead of boring ints; why not?\n",
"answer = mean(map(guess_all, permutations(cards)))\n",
"answer"
]
},
{
@@ -166,6 +166,8 @@
"metadata": {},
"source": [
"That's the correct answer ([per 538](https://fivethirtyeight.com/features/how-many-hoops-will-kids-jump-through-to-play-rock-paper-scissors/)): about 17% chance of guessing all nine cards right.\n",
"____\n",
"\n",
"\n",
"# Extra Credit: Efficient Algorithm\n",
"\n",
@@ -296,7 +298,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that `P_all(n)` agrees with the old brute-force result (except for round-off in the 17th decimal place):"
"We can see that `P_all(n)` agrees with the brute-force answer (except for round-off in the 17th decimal place):"
]
},
{
@@ -305,38 +307,17 @@
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.17085537918871255"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
"name": "stdout",
"output_type": "stream",
"text": [
"0.17085537918871255\n",
"0.17085537918871252\n"
]
}
],
"source": [
"P_all(9)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.17085537918871252"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean(map(guess_all, permutations(range(2, 11))))"
"print(P_all(9))\n",
"print(answer)"
]
},
{
@@ -350,7 +331,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 12,
"metadata": {},
"outputs": [
{
@@ -359,7 +340,7 @@
"0.008419397002884993"
]
},
"execution_count": 13,
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
@@ -370,7 +351,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 13,
"metadata": {},
"outputs": [
{
@@ -379,7 +360,7 @@
"6.67213407124781e-14"
]
},
"execution_count": 14,
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
@@ -397,13 +378,60 @@
"# Closed Form Formula?\n",
"\n",
"I would like to come up with a closed-form formula for `P_all(n)` as a function of $n$. I don't see how to define an *exact* formula, but I can see that:\n",
"- When the up card is the very middle of the remaining cards, we have a 50% chance of guessing right.\n",
"- When the up card is the very highest or very lowest of the remaining cards, we have a 100% chance of guessing right.\n",
"- When the up card is the very middle of the remaining cards, we have a 50% chance of guessing the next card right.\n",
"- When the up card is the very highest or very lowest of the remaining cards, we have a 100% chance of guessing the next card right.\n",
"- So on average (very roughly speaking), we should have about a 75% chance of guessing right on each card.\n",
"- In a full deck we make $n - 2$ guesses (we don't have to guess the first card, and we will know the last for sure).\n",
"- In a full deck we make $n - 2$ guesses (we don't have to guess the first card, and we will know the last card for sure).\n",
"- Therefore, the chance of guessing all the cards right is roughly $0.75^{(n-2)}$\n",
"\n",
"To see if this theory makes sense, let's make a logarithmic plot (see below) in which `base ** (n-2)` is an exponential function, which means it is a perfectly straight (blue) line on the log plot. We see that the `P_all(n)` data points (in red) match the exponential function at the start and end, but fall a tiny bit above the exponential in the middle. `P_all(n)` must be a more complex function than just a simple exponential. After playing around a bit, I found that `base = 0.7256`, not `base = 0.7500`, gave the best fit to `P_all(n=299)`, out of any four-decimal-place value."
"If the exponential formula $0.75^{(n-2)}$ were correct, then it would be true that `P_all(n + 1) / P_all(n) = 0.75` for all `n`. Let's sample some values of `n` and see:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{2: 0.8333333333333334,\n",
" 3: 0.8,\n",
" 4: 0.775,\n",
" 5: 0.7688172043010753,\n",
" 6: 0.7587412587412588,\n",
" 7: 0.7557603686635944,\n",
" 8: 0.7500967866821525,\n",
" 9: 0.7483290322580645,\n",
" 19: 0.7343228066190575,\n",
" 39: 0.7277139939871775,\n",
" 59: 0.7255656153885536,\n",
" 79: 0.7245013548920631,\n",
" 99: 0.7238659386192225,\n",
" 199: 0.7226021071682432,\n",
" 299: 0.7221828896968574,\n",
" 399: 0.7219736649122889}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Ns = [*range(2, 10), *range(19, 99, 20), *range(99, 400, 100)]\n",
"\n",
"{n: P_all(n + 1) / P_all(n) \n",
" for n in Ns}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that the ratio starts higher than 0.75 and becomes lower. That means that `P_all(n)` is not exactly an exponential function.\n",
"\n",
"How close is it? Let's draw a plot to see. We'll use a log scale, on which an exponential is a straight (blue) line. I use 0.725 as the base for the exponential, which nicely highlights that the `P_all(n)` data points (red) start out and end up on the blue exponential line, but rise slightly above it in the middle. Still the points are a very good fit to the line, considering that they span 56 orders of magnitude. I also show the line for `0.75 ** (n - 2)`; all the data points except the first few are well below that."
]
},
{
@@ -413,7 +441,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjYAAAIWCAYAAABEGscDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeXhU1f3H8fc3y4TNBRDqEhFERAERISi3VhhIEBQERRAUsQiKimgVq5UqbmhxpYprcQFldaMICCIEB9SOCyjuC/xcahQXcFdgSHJ+f9xAYyTDAJlkls/reeaZuXfuzHxjW/t9zvncc8w5h4iIiEgqyKjpAkRERESqihobERERSRlqbERERCRlqLERERGRlKHGRkRERFKGGhsRERFJGVk1XUB12GuvvVzTpk1rugwRERGpIitXrlznnGtU8XxaNDZNmzZlxYoVNV2GiIiIVBEz+3Rb5zUVJSIiIilDjY2IiIikDDU2IiIikjLSImMjIiLpbfPmzRQVFbFx48aaLkV2UK1atcjNzSU7Ozum69XYiIhIyisqKmK33XajadOmmFlNlyMxcs6xfv16ioqKaNasWUyf0VSUiIikvI0bN9KwYUM1NUnGzGjYsOEOjbSpsRERkbSgpiY57eh/bmpsREREJGWosREREakGzzzzDC1btuSggw7ixhtv3OY1F198Me3ataNdu3YcfPDB7LnnngCsWrUKz/No3bo1bdu25dFHH936maFDh9KsWbOtn1u1atXW90KhEO3ataN169Z06dLld7/nnAPgmmuu2Xq8rXPb0r9/fz766KOY//5ff/2VXr16ccghh9C6dWsuv/zyre/dddddTJ48OebvikbhYRERkTgrKSnh/PPPZ/HixeTm5tKxY0f69OlDq1atfnPdP//5z62v77zzTl5//XUA6tSpwyOPPEKLFi344osv6NChAz169Nja+Nxyyy3079//N9/1/fffM3LkSJ555hmaNGnC119//bu6nn32WZYvX04kEuGBBx7gp59+olWrVr87d/HFF//mc++88w4lJSUceOCBO/TP4a9//Stdu3YlEomQn5/PwoULOe644xg2bBhHH300Z5555g5937ZoxEZERNKKWXwe0bzyyiscdNBBHHjggQQCAQYNGsRTTz0V9TMzZ87k1FNPBeDggw+mRYsWAOy77740btyYb775JurnZ8yYQb9+/WjSpAkAjRs3/t01PXr0oEePHkycOJH169dz8cUXb/NcRdOnT6dv375bj+vVq8cVV1zB4YcfTqdOnfjqq69+95k6derQtWtXAAKBAO3bt6eoqGjre02bNuWVV16J+jfFQo2NiIhInH3++efsv//+W49zc3P5/PPPK73+008/5eOPP6Zbt26/e++VV14hEonQvHnzreeuuOIK2rZty8UXX8ymTZsA+PDDD/nuu+8IBoN06NCBRx555HfftXjxYhYtWsSFF15Iw4YNueOOO7Z5rqIXX3yRDh06bD3+5Zdf6NSpE2+88QadO3fm/vvvj/rP4/vvv2fevHnk5+dvPZeXl8fzzz8f9XOx0FSUiIiklUoiI3H+zd//aLS7fWbNmkX//v3JzMz8zfm1a9cyZMgQHn74YTIy/LGJ8ePHs/feexOJRBgxYgQ33XQTV111FcXFxaxcuZLCwkI2bNiA53l06tSJgw8+eOv3FRQU0L17d6655hrOOuusrXVu61zFOho1+t/G2oFAgN69ewPQoUMHFi9eXOnfVlxczKmnnsqFF174m6msxo0b8/7771f6uVhpxEZERCTOcnNz+eyzz7YeFxUVse+++1Z6/axZs7ZOQ23x448/0qtXL66//no6deq09fw+++yDmZGTk8OZZ565dTonNzeXnj17UrduXfbaay86d+7MG2+88Zvv3NJcbQkKm9k2z1VUu3bt36wtk52dvfW6zMxMiouLKSkp2Rpovuqqq7ZeO2LECFq0aMFFF130m+/cuHEjtWvXrvSfSazU2IiIiMRZx44dWb16NR9//DGRSIRZs2bRp0+fbV77wQcf8N133+F53tZzkUiEk046iTPOOIMBAwb85vq1a9cC/qjQnDlzaNOmDQB9+/bl+eefp7i4mF9//ZWXX36ZQw89tEr+nkMPPZQ1a9ZEvSYzM5NVq1axatUqrrvuOgCuvPJKfvjhB26//fbfXf/hhx9urX1XqLERERGJs6ysLO666y569OjBoYceyimnnELr1q0BuOqqq5g7d+7Wa2fOnMmgQYN+M1Ly2GOPsXz5cqZMmfK727oHDx7MYYcdxmGHHca6deu48sorAb/56NmzJ23btuXII4/krLPOqpLGAaBXr16EQqEd+kxRURE33HAD7777Lu3bt6ddu3Y88MADW99/8cUX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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 648x648 with 1 Axes>"
]
@@ -425,18 +453,20 @@
}
],
"source": [
"base = 0.7256\n",
"base = 0.725\n",
"\n",
"X = range(2, 300, 3)\n",
"Y = [P_all(n) for n in X]\n",
"X = range(2, 400, 4)\n",
"P = [P_all(n) for n in X]\n",
"E = [base ** (n - 2) for n in X]\n",
"G = [0.75 ** (n - 2) for n in X]\n",
"\n",
"plt.figure(figsize=(9, 9))\n",
"plt.yscale('log')\n",
"plt.xlabel(\"Number of Cards, n\")\n",
"plt.ylabel(\"Probability of Guessing All Right (log scale)\")\n",
"plt.plot(X, G, 'g:', label='0.750 ** (n-2)')\n",
"plt.plot(X, E, 'b-', lw=2, label=f'{base} ** (n-2)')\n",
"plt.plot(X, Y, 'r.', label='P_all(n)')\n",
"plt.plot(X, P, 'r.', label='P_all(n)')\n",
"plt.legend();"
]
},
@@ -456,7 +486,7 @@
"\n",
"In the table below, `n` is the number of cards, `s` is the size of the cache, and we see that `s` is always equal to $c = n \\times (n + 1) / 2 - 1$. \n",
"\n",
"The last three columns of the table don't deal with computational complexity. They give the value of `P_all(n)`, the approximation `base ** (n - 2)`, and the percentage difference between the true value and the approximation."
"The last four columns of the table don't deal with computational complexity. They give the value of `P_all(n)`, the ratio `P_all(n + 1) / P_all(n)`, the approximation `base ** (n - 2)`, and the percentage difference between the true value and the approximation."
]
},
{
@@ -468,45 +498,40 @@
"name": "stdout",
"output_type": "stream",
"text": [
" n | s | s==c || P_all(n) | base**(n-2) | diff (base=0.7256)\n",
"—————|————————|——————||——————————|—————————————|———————\n",
" 2 | 2 | True || 1.0e+00 | 1.0e+00 | 0%\n",
" 3 | 5 | True || 8.3e-01 | 7.3e-01 | 13%\n",
" 4 | 9 | True || 6.7e-01 | 5.3e-01 | 21%\n",
" 5 | 14 | True || 5.2e-01 | 3.8e-01 | 26%\n",
" 6 | 20 | True || 4.0e-01 | 2.8e-01 | 30%\n",
" 7 | 27 | True || 3.0e-01 | 2.0e-01 | 33%\n",
" 8 | 35 | True || 2.3e-01 | 1.5e-01 | 36%\n",
" 9 | 44 | True || 1.7e-01 | 1.1e-01 | 38%\n",
" 19 | 189 | True || 8.4e-03 | 4.3e-03 | 49%\n",
" 39 | 779 | True || 1.6e-05 | 7.0e-06 | 55%\n",
" 59 | 1,769 | True || 2.6e-08 | 1.1e-08 | 56%\n",
" 79 | 3,159 | True || 4.2e-11 | 1.9e-11 | 56%\n",
" 99 | 4,949 | True || 6.7e-14 | 3.1e-14 | 54%\n",
" 119 | 7,139 | True || 1.0e-16 | 5.0e-17 | 51%\n",
" 139 | 9,729 | True || 1.6e-19 | 8.2e-20 | 48%\n",
" 159 | 12,719 | True || 2.4e-22 | 1.3e-22 | 44%\n",
" 179 | 16,109 | True || 3.7e-25 | 2.2e-25 | 40%\n",
" 199 | 19,899 | True || 5.5e-28 | 3.6e-28 | 35%\n",
" 219 | 24,089 | True || 8.3e-31 | 5.9e-31 | 29%\n",
" 239 | 28,679 | True || 1.3e-33 | 9.7e-34 | 23%\n",
" 259 | 33,669 | True || 1.9e-36 | 1.6e-36 | 15%\n",
" 279 | 39,059 | True || 2.8e-39 | 2.6e-39 | 7%\n",
" 299 | 44,849 | True || 4.2e-42 | 4.2e-42 | 2%\n"
" n | s | s==c ||P_all(n) |P(n+1)/P(n)|base**(n-2)| Δ(P, 0.725**(n-2))\n",
"—————|————————|——————||—————————|———————————|———————————|——————————————————\n",
" 2 | 2 | True || 1.0e+00 | 0.8333 | 1.0e+00 | 0%\n",
" 3 | 5 | True || 8.3e-01 | 0.8000 | 7.2e-01 | 13%\n",
" 4 | 9 | True || 6.7e-01 | 0.7750 | 5.3e-01 | 21%\n",
" 5 | 14 | True || 5.2e-01 | 0.7688 | 3.8e-01 | 26%\n",
" 6 | 20 | True || 4.0e-01 | 0.7587 | 2.8e-01 | 30%\n",
" 7 | 27 | True || 3.0e-01 | 0.7558 | 2.0e-01 | 34%\n",
" 8 | 35 | True || 2.3e-01 | 0.7501 | 1.5e-01 | 36%\n",
" 9 | 44 | True || 1.7e-01 | 0.7483 | 1.1e-01 | 38%\n",
" 19 | 189 | True || 8.4e-03 | 0.7343 | 4.2e-03 | 50%\n",
" 39 | 779 | True || 1.6e-05 | 0.7277 | 6.8e-06 | 57%\n",
" 59 | 1,769 | True || 2.6e-08 | 0.7256 | 1.1e-08 | 58%\n",
" 79 | 3,159 | True || 4.2e-11 | 0.7245 | 1.8e-11 | 58%\n",
" 99 | 4,949 | True || 6.7e-14 | 0.7239 | 2.8e-14 | 57%\n",
" 199 | 19,899 | True || 5.5e-28 | 0.7226 | 3.1e-28 | 45%\n",
" 299 | 44,849 | True || 4.2e-42 | 0.7222 | 3.3e-42 | 20%\n",
" 399 | 79,799 | True || 3.0e-56 | 0.7220 | 3.6e-56 | -19%\n"
]
}
],
"source": [
"P_all_given.cache_clear()\n",
"print(f' n | s | s==c || P_all(n) | base**(n-2) | diff (base={base})')\n",
"print(f'—————|————————|——————||——————————|—————————————|———————')\n",
"for n in list(range(2, 10)) + list(range(19, 300, 20)):\n",
"\n",
"print(f' n | s | s==c ||P_all(n) |P(n+1)/P(n)|base**(n-2)| Δ(P, {base}**(n-2))')\n",
"print(f'—————|————————|——————||—————————|———————————|———————————|——————————————————')\n",
"for n in Ns:\n",
" p = P_all(n)\n",
" s = P_all_given.cache_info().currsize\n",
" c = n * (n + 1) / 2 - 1\n",
" e = base ** (n - 2)\n",
" diff = abs(p - e) / p\n",
" print(f'{n:4d} | {s:6,d} | {s == c} || {p:8.1e} | {e:8.1e} | {diff:3.0%}')"
" r = P_all(n + 1) / P_all(n)\n",
" Δ = (p - e) / p\n",
" print(f'{n:4d} | {s:6,d} | {s == c} ||{p:8.1e} | {r:6.4f} | {e:8.1e} | {Δ:3.0%}')"
]
}
],