Skip to content

Instantly share code, notes, and snippets.

@dmargala
Created December 6, 2016 07:11
Show Gist options
  • Save dmargala/ae26157f70f5288459ca361cfdf1fd8e to your computer and use it in GitHub Desktop.
Save dmargala/ae26157f70f5288459ca361cfdf1fd8e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The 41 FiveThirtyEight staff members have decided to send gifts to each other as part of a Secret Santa program. Each person is randomly assigned one of the other 40 people on the masthead to give a gift to, and they can’t give to themselves. After the Secret Santa is over, everybody naturally wants to find out who gave them their gift. So, each of them decides to ask up to 20 people who they were a Secret Santa for. If they can’t find the person who gave them the gift within 20 tries, they give up. (Twenty co-workers is a lot of co-workers to talk to, after all.) Each person asks and answers individually — they don’t tell who anyone else’s Secret Santa is. Also, nobody asks any question other than “Who were you Secret Santa for?”\n",
"\n",
"If each person asks questions optimally, giving themselves the best chance to unmask their Secret Santa, what is the probability that everyone finds out who their Secret Santa was? And what is this optimal strategy? (Asking randomly won’t work, because only half the people will find their Secret Santa that way on average, and there’s about a 1-in-2 trillion chance that everyone will know.)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from collections import Counter"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"num_staff = 41"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"max_tries = num_staff // 2"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"x = np.arange(num_staff)\n",
"np.random.shuffle(x)\n",
"while np.any(x == np.arange(num_staff)):\n",
" np.random.shuffle(x)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([13, 3, 31, 8, 34, 16, 4, 33, 23, 21, 37, 14, 18, 24, 5, 9, 40,\n",
" 22, 7, 17, 12, 38, 2, 20, 28, 10, 6, 0, 36, 39, 35, 1, 27, 25,\n",
" 30, 11, 32, 29, 19, 26, 15])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"num_trials = 10000"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def assign_secret_santas(num_staff):\n",
" x = np.arange(num_staff)\n",
" np.random.shuffle(x)\n",
" while np.any(x == np.arange(num_staff)):\n",
" np.random.shuffle(x)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"test_assignments = np.array([assign_secret_santas(num_staff) for i in range(num_trials)])"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1084aecd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"im = np.array([np.bincount(test_assignments[:, i], minlength=num_staff).tolist() for i in range(num_staff)])\n",
"plt.imshow(im, interpolation='none', cmap=plt.cm.viridis, vmin=0, vmax=2*num_trials/float(num_staff-1))\n",
"plt.colorbar();"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"assignments = np.array([assign_secret_santas(num_staff) for i in range(num_trials)])\n",
"outcomes = np.ones(num_trials, dtype=bool)\n",
"\n",
"graphs = []\n",
"\n",
"def ask_coworker(secret_santas, my_index, coworker_index, try_number=0):\n",
" if try_number > max_tries:\n",
" return False\n",
" elif coworker_index == my_index:\n",
" return True\n",
" else:\n",
" return ask_coworker(secret_santas, my_index, secret_santas[coworker_index], try_number + 1)\n",
" \n",
"def run_trial(i):\n",
" for coworker_index in np.arange(num_staff):\n",
" coworker_index = np.mod((coworker_index + np.random.randint(1, num_staff)), num_staff)\n",
" outcome = ask_coworker(assignments[i], coworker_index, assignments[i, coworker_index], 0)\n",
" if not outcome:\n",
" outcomes[i] = False\n",
" # if someone can't find their secret santa, bail on this trial\n",
" break\n",
" \n",
"for i in range(num_trials):\n",
" run_trial(i)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#np.savez('santas_assignments.npz', assignments)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import networkx as nx"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAEZCAYAAACKBIRIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt81PWV//HXmVsyCblARCxFC167TaACYm1jW9HaWgWk\nrW7BotTtrq5bir+uKPZixd6sNb1YKdvai+KlYG3LFrCy3ZbUFmldBFogvWhVtBSFCgZCMklmJuf3\nx3dCEuQSyCQzSd7Px4OHyff7nXBgYvie7+d8zjF3R0RERERERHoulOsAREREREREBgolWCIiIiIi\nIlmiBEtERERERCRLlGCJiIiIiIhkiRIsERERERGRLFGCJSIiIiIikiVKsERERERERLJECZaIiIiI\niEiWKMESERERERHJEiVYIiIiIiIiWaIES0REREREJEuUYImIiIiIiGSJEiwREREREZEsUYIlIiIi\nIiKSJUqwREREREREskQJloiIiIiISJYowRIREREREckSJVgiIiIiIiJZogRLREREREQkS5RgiYiI\niIiIZIkSLBERERERkSxRgiUiIiIiIpIlSrBERERERESyRAmWiIiIiIhIlijBEhERERERyRIlWCIi\nIiIiIlmiBEtERERERCRLlGCJiIiIiIhkiRIsERERERGRLFGCJSIiIiIikiVKsERERERERLJECZaI\niIiIiEiWKMESERERERHJEiVYIiIiIiIiWaIES0REREREJEuUYImIiIiIiGSJEiwREREREZEsUYIl\nIiIiIiKSJUqwREREREREskQJloiIiIiISJYowRIRERER6WNmFjGzMjML5zoWyS4lWCIiIiIifcDM\nCsxsVqho6GYs1EqkYCcWSobi5ZvNbJaZFeQ6Ruk5c/dcxyAiIiIiMqCZ2dkWjT8WO3FitOS8G0ri\nlVOwcARPp0jUraShtqahdduGpCcTF7n7ulzHK8dOCZaIiIiISC8ys0kWLaqtmL2kuKhq2iGva9qy\nnF2LZzZ6smmykqz+SwmWiIiIiEgvMbMCi8a3V8xeOixccgKv/vfHMQsTO2kS5ZfWsOuhq0i/+iIW\nKaDiqqW0PL+GXYtn7PZkYqS7t+Q6fjl62oMlIiIiItJ7Lo+NmhAtqppGZNhoRny0lhFzf016305a\nnvsNFilgxMcep/jsD9O0/iGKqqYRHTU+BlyW68Dl2CjBEhERERHpJRYvn18yeV4JQLjkeCwSC46H\n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\nRhUsEREpGO9qdnhZ6LihweiI66PhyrEttgpVU7eyKpbcvL5btgr1pLWIHI5absd1qQQuGefNX17K\nwKnLIZ3grYcu54grf9dq5ly+BoyL5JMCloiIFFR2MLn1K7vBNcYq8QdTpJMBK4rWuL27u3UweU9a\ni8jhpq2h3tvuHsnAqctp/Nfj1D81h6b4LvylR9F/4hx8obCGekuvpIAlIiI9hpn5wZvHV+gOfT1p\nLSK9nZn5MV/y+KpGazkSIRuwGp77HfVP/YKB01ZRv+YeXDJO6YVfw6VTbJpR5HBNQf1/KL2F7sES\nEZEewzmXds7t7gknUj1pLSKHgeyA8Taf9PUro+ikczEz+p0yktS2vwMthnp7FztEegUFLBERERHJ\nt30DxlvJ7KQKnTCM5LYXAUi8/hz+zHBvDfWW3kgBS0RERETy6oAB4+kU22d/lOSWF3hzzsdJ7dhI\n0XsuYNudF7Dnr78i+uFrAQ31lt5J92CJiIiISN5pqLf0FapgiYiIiEh3WJDYvC7Z3ry5rIaaRSQ3\nr08Cj+R3WSK5pYAlIiIiInmnod7SV2iLoIiIiIh0Gw31lsOdApaIiIiIdCsN9ZbDmQKWiIiIiBSM\nhnrL4UYBS0REREREJEfU5EJERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBS0RE\nREREJEcUsERERERERHJEAUtERERERCRHFLBERERERERyRAFLREREREQkRxSwREREREREckQBKWTx\nwAAAAA5JREFUS0REREREJEf+P8wO8VLz+MsmAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a25f290>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"G = nx.Graph(zip(np.arange(num_staff), assignments[np.random.randint(num_trials)]))\n",
"graphs = list(nx.connected_component_subgraphs(G))\n",
"loop_sizes = [g.number_of_nodes() for g in graphs]\n",
"plt.figure(figsize=(12, 4), frameon=False)\n",
"for i, g in enumerate(graphs):\n",
" color = 'orange' if g.number_of_nodes() > max_tries else 'dodgerblue'\n",
" nx.draw_networkx(g, pos=nx.spring_layout(g, k=0.01, iterations=1000, center=(i, 0), scale=1.0/3.0), \n",
" node_size=200, node_color=color, font_size=8)\n",
"plt.axis('off')\n",
"plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# for j in xrange(0, num_trials, 100):\n",
"# G = nx.Graph(zip(np.arange(num_staff), assignments[j]))\n",
"# graphs = list(nx.connected_component_subgraphs(G))\n",
"# loop_sizes = [g.number_of_nodes() for g in graphs]\n",
"# plt.figure(figsize=(12, 4), frameon=False)\n",
"# for i, g in enumerate(graphs):\n",
"# color = 'orange' if g.number_of_nodes() > max_tries else 'dodgerblue'\n",
"# nx.draw_networkx(g, pos=nx.spring_layout(g, k=0.01, iterations=1000, center=(i, 0), scale=1.0/3.0), \n",
"# node_size=200, node_color=color, font_size=8)\n",
"# plt.axis('off')\n",
"# plt.tight_layout()\n",
"# plt.savefig('santas/{:06d}.png'.format(j), dpi=75, bbox_inches='tight')\n",
"# plt.close()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# np.mean(outcomes[np.arange(0, num_trials, 100)])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# !montage 0*png -tile 5x20 -geometry 120x40+1+1 montage.png"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment