Skip to content

Instantly share code, notes, and snippets.

@ctb
Created October 11, 2012 02:16
Show Gist options
  • Save ctb/3869768 to your computer and use it in GitHub Desktop.
Save ctb/3869768 to your computer and use it in GitHub Desktop.
HW #5
{
"metadata": {
"name": "solutions-week5-coinflips"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Coin flipping!"
},
{
"cell_type": "code",
"collapsed": false,
"input": "import random\n\ndef flip_a_fair_coin(N):\n coin = ['H', 'T']\n \n record = []\n for i in range(N):\n record.append(random.choice(coin))\n \n # record is a list of H and T; turn it into a string by using string.join.\n record = \"\".join(record)\n return record",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": "flip_a_fair_coin(5)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 4,
"text": "'HHTTT'"
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": "# count the number of times you see a \"run\" of a given pattern, e.g. HTTHHT, in a given pattern of coinflips\ndef count_runs(run, coinflips):\n return coinflips.count(run)\n \nflips = flip_a_fair_coin(10000)\nthe_count = count_runs('HTHHTT', flips)\n\n# expected:\np = 1.0/2**6 # length of the 'HTHHTT' string, above\nexpected_count = p * len(flips)\nprint 'expected', expected_count, '; got:', the_count, '; diff: ', abs(the_count - expected_count)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "expected 156.25 ; got: 153 ; diff: 3.25\n"
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## Question A -- where is count_runs broken?\n\nThere are some strings -- hint, including some rather simple ones -- for which count_strings doesn't work properly: that is, the actual counts differ, sometimes dramatically, from the expected counts. Write down at least two examples 'runs' and develop a simple hypothesis as to what's going on, i.e. why count_runs is broken."
},
{
"cell_type": "code",
"collapsed": false,
"input": "# CTB -- the main problem is this: 'count' does not count overlapping runs.\n# so, for example:\nprint count_runs(\"HT\", \"HTHTHTHT\")\n# works fine, but:\n\nprint count_runs(\"HH\", \"HHHH\")\n\n# does not -- there should be THREE pairs of heads in there, but .count is only finding the one at position 0 and the one at position 2.\n# So basically any runs that could contain overlaps don't work.",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "4\n2\n"
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## Question B -- fix count_runs.\n\nWrite your *own* count_runs -- you can use 'string.find' in a loop, for example -- that works properly. Verify that it works on the above strings."
},
{
"cell_type": "code",
"collapsed": false,
"input": "# There are a couple different ways to do this. Perhaps the easiest is this:\ndef count_runs2(run, coinflips):\n the_count = 0\n for n in range(len(coinflips)):\n if coinflips[n:n + len(run)] == run:\n the_count += 1\n return the_count\n\nprint count_runs2(\"HH\", \"HHHH\")\n",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "3\n"
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": "# One important point for everyone -- string.find doesn't work the way you think it does!\ns = \"HH\"\nif s.find(\"HH\"):\n print 'Found it!'\nelse:\n print 'Didn\\'t find it...'",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Didn't find it...\n"
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": "# this is because string.find returns -1 when it *doesn't* find the string... and that evaluates to True in an if statement.\n\n# REMEMBER: ALWAYS TEST YOUR CODE WITH SOMETHING SIMPLE TO SEE IF IT'S WORKING!",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": "",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "solutions-week5-coinflips2"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Coin flipping, round 2! Computational statistics!\n\nLet's change the coin flipping code from the other homework this week (http://nbviewer.ipython.org/urls/raw.github.com/beacon-center/intro-computational-science/master/hw-week5-coinflips.ipynb) to be a little more convenient.\n\nOur goal, below, is to be able to reliably distinguish between *fair* and *unfair* coin flipping functions, to a p < 0.05."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import random\n\ndef flip_a_fair_coin(N):\n coin = [0, 1] # 0/1 instead of H/T\n \n record = []\n for i in range(N):\n record.append(random.choice(coin))\n\n return record\n\ndef flip_an_unfair_coin(N):\n coin = [0, 1, 1, 1] # 0/1 instead of H/T\n \n record = []\n for i in range(N):\n record.append(random.choice(coin))\n\n return record",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "x = flip_a_fair_coin(5)\nprint 'A completely fair coin would yield an average of 2.5:', sum(x) / 5.",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "A completely fair coin would yield an average of 2.5: 0.8\n"
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## Plotting distributions of coin flips\n\nComputers make it easy to try things lots of times! Here is how you plot the distribution of X averages of N coin flips."
},
{
"cell_type": "code",
"collapsed": false,
"input": "# do X independent coin flip experiments, N times each.\ndef distribution_of_coin_flips(N, X, coin_flipping_fn):\n results = []\n for i in range(X):\n avg = sum(coin_flipping_fn(N)) / float(N)\n results.append(avg)\n return results\n",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": "d = distribution_of_coin_flips(100, 500, flip_a_fair_coin)\ne = distribution_of_coin_flips(100, 500, flip_an_unfair_coin)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": "hist(d, normed=True)\nhist(e, normed=True)\naxis(xmin=0, xmax=1)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 6,
"text": "(0, 1, 0.0, 12.0)"
},
{
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x7fe77491c5d0>"
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## T-tests!\n\nNext we are going to apply a one sample Student's t-test -- see these convenient links:\n\n[Student's T-test](http://en.wikipedia.org/wiki/Student's_t-test)\n\n[Student's t-distribution](http://en.wikipedia.org/wiki/Student%27s_t-distribution)\n\nBasically, what you're doing here is comparing the distributions (plotted above) to see how much overlap they have. If the distributions have lots of overlap then it will be hard to determine that they are different (e.g. that one coin is fair and the other is unfair). This is dependent on # of samples and the unfairness of the coins.\n\nBelow is an implementation taken from the t-test and t-distribution pages, above."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import math\n\ndef one_sample_t_test(sample_mean, sample_stddev, sample_n, expected_mean):\n numerator = sample_mean - expected_mean\n denominator = sample_stddev / float(math.sqrt(sample_n))\n \n return abs(numerator / denominator)\n\np05_value = 6.314\n\n# apply like so:\nflip_record = flip_a_fair_coin(20)\n\n# avg = ...\n# stddev = ...\n# t_statistic = one_sample_t_test(avg, stddev, len(flip_record), 0.5)\n# if t_statistic < p05_value:\n# print 'FAIR'\n# else:\n# print 'UNFAIR'",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## The homework!\n\nFor the functions 'flip1', 'flip2', and 'flip3', imported below, determine which of them represent fair and which of them represent unfair coins.\n\nA: plot the distributions of their averages.\n\nB: apply the one-sample t-test defined above, to a certainty of p < 0.05 -- which functions are fair and which are unfair?\n\nC: for each 'flip' function write a loop to roughly determine the number of coin flips you need to record in order to reach a conclusion about fair or unfair. (Yes, that's vague. Deal. :)"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from hw_week5_coin_fns import flip1, flip2, flip3\n\nprint flip1(5)\nprint flip2(5)\nprint flip3(5)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "[1, 1, 0, 0, 0]\n[1, 1, 1, 1, 1]\n[1, 1, 0, 1, 1]\n"
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": "d = distribution_of_coin_flips(100, 500, flip1)\ne = distribution_of_coin_flips(100, 500, flip2)\nf = distribution_of_coin_flips(100, 500, flip3)\n\nhist(d, normed=True)\nhist(e, normed=True)\nhist(f, normed=True)\n\naxis(xmin=0, xmax=1)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 11,
"text": "<matplotlib.legend.Legend at 0x7fe774dc1e90>"
},
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD9CAYAAABOd5eOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE9lJREFUeJzt3WtsFNUfxvFncAkt2oWtoHgBtYpCQQGlFAV0GxHRBi8R\nY+s1gAbKC8UXvtBoXDVeiCZq4J9aTbxxM0aMqIiEvtg2orbFS1TA4A2VxhfgVroCVdrO/0W1Urrs\nzs7u7G7Pfj/JJt3tdOa3p92Hw5kzZyzbtm0BAAa0QdkuAACQOsIcAAxAmAOAAQhzADAAYQ4ABiDM\nAcAAccN84cKFOvnkk3X++ef3vhaNRnXttddqzJgxuu666/Tnn396XiQAIL64Yb5gwQJ9+OGHfV6r\nra3VmDFj9N133+n000/XCy+84GmBAIDE4ob5rFmzFAgE+rzW3NysRYsWaciQIVq4cKGampo8LRAA\nkFjSY+YtLS0aN26cJGncuHFqbm5Oe1EAgOT4kv0Bp1f/W5aVdDEAAOc5e6Ske+ZlZWXauXOnJGnn\nzp0qKyuLWxAPWw8//HDWa8iVB21BW9AW8R9uJR3m5eXlevnll3Xo0CG9/PLLmj59uuuDAwDSI26Y\nV1dX65JLLtGuXbs0evRovfLKK6qpqdEvv/yi8847T62trVqyZEmmakUCfn+xLMuK+/D7i7NdJgAP\nxB0zX7duXczXN2zY4EkxpgoGgxk5TjTaJin+f9Oi0eyey8hUWwwEtMV/aIvUWXYqgzTxdmxZKY3/\nIHk9J50TtTm/FyCXuc3OpGezAEC2FRcXq62tLdtlpCQQCCgSiaRtf/TMDULPHPnChHw51ntw+95Y\naAsADECYA4ABCHMAMABhDgBpsnLlSk2dOlUFBQVasGBBRo/NbBYARvD7i/+51sIbRUUBtbfHn31y\n2mmn6aGHHtLmzZt16NAhz2qJhTAHYAQnF82ltv/EF9xdf/31kqRt27Zpz549ntUSC8MsAJBm2Zg2\nSZgDQJplYwlwwhwA0oyeOQAYgJ45AAxgXV1d6ujoUGdnp7q6uvTXX3+pq6srI8cmzAEgTR577DEN\nHTpUy5cv1+rVq1VYWKjHH388I8dmoS2DsNAW8kWsfMmFeebJSPdCW4S5QQhz5AsT8oVVEwEA/RDm\nAGAAwhwADECYA4ABCHMAMABhDgAGIMwBwACEOQAYgDAHgDT5+++/tWjRIp155pkaOXKkbrvtNm3d\nujUjxybMARjB7y+WZVmePfz+4oQ1dHZ2asyYMWpsbFRra6uCwaCqqqrU2dnp+fvncn6DcDk/8kWs\nfHH295/SUV19dsaOHauVK1fqyiuv7Ls3LucHgIGhtbVVra2tKikp8fxYhDkAeODvv//WLbfcorvu\nuktjx471/HgMsxiEYRbki1wfZunu7lZVVZUOHTqkd955R8cdd1z/vaV5mMWX9E8AAI7Jtm0tWrRI\n+/bt06ZNm2IGuRcIcwBIo6VLl+rbb79VfX29hgwZkrHjMsxiEIZZkC9ydZjl559/1llnnaWCgoI+\nPfIXX3xR1dXVfffGMAsA9FdUFFA0anm6/0TOOOMMdXd3e1ZDPK5ns7z00ku65JJLdNFFF2nZsmXp\nrAkAktbeHpFt25490nn/Ty+4CvNIJKInnnhCW7ZsUUtLi3bt2qXNmzenuzYAgEOuhlkKCwtl27b2\n798vSTp48KACgcT/BQEAeMNVz7ywsFC1tbU688wzNWrUKM2YMUPTpk1Ld20AAIdc9cz37t2rmpoa\n7dixQ4FAQDfeeKM2btyoysrKPtuFQqHer4PBoILBYCq1AoBxwuGwwuFwyvtxNTVx48aNWrVqld54\n4w1JUm1trXbv3q3ly5f/t2OmJmYcUxORL0zIl5xYaGvWrFnatm2bIpGI/vrrL23atElz5sxxsysA\nQBq4Gmbx+/168MEHdf311+vgwYOaO3euKioq0l0bAMAhrgA1CMMsyBcm5EtODLMAAGK79dZbdcop\npygQCKiiokJ1dXUZOS49c4PQM0e+iJUvfn+xotE2z45ZVBRwdBXo9u3bdfbZZ2vIkCFqbm7WlVde\nqa1bt2rChAl9tmNtFgCIoSfIveuoOF335d/Q7urqkmVZ8vl8Kigo8KyufzHMAgBptnTpUp1wwgma\nOXOm1q1bp7PPPtvzYzLMYhCGWZAvcnUJ3CP9e5ehpUuXauvWrSotLe27N06AAkDuKywsVHV1tSoq\nKrR+/XrPj0eYA4CHDhw4oFNOOcXz4xDmAJAme/fu1RtvvKE///xTbW1teu2119TU1NTvLkNeIMwB\nIE0sy9ILL7yg0aNHa9KkSWpqatL777+v448/3vtjcwLUHJwAPbZiv19t0WjC7QJFRYq0t2egIqQi\nl+eZO5XuE6CEuUEI82OzLMvRPAdLysv2GWhMyBdmswAA+iHM845PlmXFffj9xdkuEkCSuJw/73Qq\n0VCM08uWAeQOwhzAgBMIBP45RzRwBQKBtO6PE6AGcXoCNB9PknICFAMFJ0ABII8R5gBgAMIcOErM\nGT7D/dkuC4iLE6DA0UL9X4qGEl89CmQTPXMAMABhDgAGIMwBwACEOQAYgDAHAAMQ5gBgAMIcAAxA\nmAOAAQhzADAAYQ4ABiDMBwi/vzjhHYIA5C/CfIDoueu4neABSfIP9/MPHfIOC23BONH90f6LZR39\nHDAMPXMAMABhDgAGIMwBwACuw/zAgQO64447dO6556q0tFSffvppOusCACTB9QnQhx9+WGPGjFFd\nXZ18Pp8OHDiQzroAR4r9frVFY9wFKJTxUoCsch3m9fX1+uSTT1RQUCBJGjZsWNqKApxqi0YdTcpk\nciJM52qYZc+ePero6FBNTY3Ky8u1fPlydXR0pLs2AIBDrnrmHR0d2rVrl55++mnNnj1bixcv1ptv\nvqnbb7+9z3ahUKj362AwqGAwmEqtyGP+4f6e+eMe80nqDMX+3pEXHwWKihRpb/e8HpgvHA4rHA6n\nvB/Ltm1Xlw6OHz9eO3fulCRt2rRJr7/+utatW/ffji1LLneNGHqCJFF7pm+bXPvdWZYVexw85Oza\nVyfvOuntcqyNYAa32el6NsvYsWPV1NSk7u5ubdy4UbNnz3a7KwBAilyH+TPPPKN77rlHF154oQoK\nClRVVZXOugAASXA9m+Xcc89lbjkA5AiuAAUAAxDmOYC1ygcen5Twd2ZZlor9/myXijzBErg54L+1\nyuMh0HNJpxzOeol1dSrgAXrmAGAAwhwADECYA4ABCHMAMABhDgAGIMwBwACEOQAYgDAHAAMQ5gBg\nAMIcAAxAmAOAAQhzADAAYQ4ABiDMAcAAhDkAGIAwBwADEOYAYADCHAAMQJgDgAEIcwAwAGEOAAYg\nzAHAAIQ5ABiAMAcAAxDmAGAAwhwADECYA4ABCHMAMABhDgAGIMwBwACEOQAYgDAHAAMQ5gBgANdh\n3tXVpSlTpmjevHnprAcA4ILrMH/++edVWloqy7LSWQ8AwAVXYb5nzx598MEHuvPOO2XbdrprAgAk\nyVWY33vvvXr66ac1aBBD7gCQC3zJ/sD777+vk046SVOmTFE4HI67bSgU6v06GAwqGAwmezgAMFo4\nHE6YpU5YdpLjJA888IBWrVoln8+njo4Otbe364YbbtDrr7/ed8eWxRCMQz3nHRK1VWa3ybXfnWVZ\nUijGN0KJ343k7F17tl2OtSVym9vsTDrMj9TQ0KBnnnlG7733XtoKykeEeWKEOfKF2+xMedCb2SwA\nkH0p9czj7pieuWP0zBOjZ458kbWeOQAg+whzADAAYQ4ABiDMAcAAhDkAGIAwBwADEOYAYADCHAAM\nQJgDgAEIcwAwAGEOAAYgzAHAAIQ5ABiAMAcAAxDmAGAAwhwADECYA4ABCHMAMABh7jG/v1iWZcV9\n5DP/cH/C9sn3NgKc8GW7ANNFo21ydl/O/BTdH419b8+jOdkGyGP0zAHAAIQ5ABiAMAcAAxDmgMdi\nndD1D/dnuywYhhOggNdC/V+KhqIZLwNmo2cOAAYgzAHAAIQ5ABiAMAcAA3ACFBlV7PerLXrUyb9Q\n/+18kjqPfjHGdgB6EObIqLZoNOHiBlLPAgdOtwPAMAsAGIEwBwADEOYAYADCHAAM4CrMf/31V1VU\nVGjChAkKBoNau3ZtuusCACTB1WyWwYMH69lnn9XkyZO1b98+TZs2TfPmzVNRUVG66wMAOOCqZz5q\n1ChNnjxZkjRixAhNmDBB27ZtS2thAADnUh4z//7777V9+3ZNmzYtHfUAAFxI6aKhaDSqm266Sc8+\n+6yOP/74ft8PhUK9XweDQQWDwVQOBwDGCYfDCofDKe/Hsm3byYV2/Rw+fFiVlZW6+uqrtWzZsv47\ntiy53LVReu4s7+SGzrm1jVe/O8uy0n4FaK5vF3MZgpD4fCAmt9npapjFtm0tWrRIEydOjBnkAIDM\nctUz/+ijj3TppZfqggsu+KfnKT355JOaO3fufzumZy5poPbMByvGMld9FBUF1N4eSbCfGEfPs555\n4pbsESgqUqS93cGWMJ3b7HQ9zJJwx4S5pIEa5t4NxeRbmCe1HZ8XKMPDLACA3EKYA4ABCHMAMABh\nDgAGIMwBwACEOQAYgDAHAAMQ5nDJJ8uy4j78/uJsFwnkjZQW2kI+61Siy2GiUSszpQCgZw4AJiDM\nAcAAhDkAGIAwBwADEOYAYADCHAAMQJgDgAEIcwAwABcNwRuD/FK3em8rCMBbhDm80R095l3pAaQf\nwywAYADCHAAMQJgDgAEIcwAwgGXbdvx1TN3u2LLk0a4HlJ7ZHInaYeBv45NfnYom+JkeTv4qnFRg\n3HZ8XiD32clsFqRFp6KOQwtA+jHMAgAGIMwBwACEOQAYgDBPgd9fnPCmxoBTx7wx9nB/tkvDAMBs\nlhTky0wVZ9tYuT9bJIe3G6yeW2QnEigqUqS93cGWGKiYzQIMYJ1y+I9D1Nn0T+Qfhlng3CC/evqa\n/w4fWUc9RyYwHINY6JnDuWOthCixGmImhWK/HA3Ra89n9MwBwACEOQAYgDAHAAO4DvPGxkaNHz9e\nY8eO1YoVK9JZk4HC2S4AOSic7QJySDgcznYJA57rML/nnntUV1en+vp6/e9//9O+ffvSWZdhwtku\nADkonO0CcghhnjpXs1n2798vSbr00kslSXPmzFFTU5MqKyvTVxlyQr+lbUNZKwVAHK565i0tLRo3\nblzv89LSUn366adpKwq549+lbRM9AGSXp/PM82NtEifv8ZF/HqnuJzvbOP0tsl3y2x35V+H40xKK\nc6wB/Jl75JFEnxHE4yrMy8rKdN999/U+3759u+bOndtnG9PXZQGAXOJqmGXYsGGSema07N69W1u2\nbFF5eXlaCwMAOOd6mOW5557T4sWLdfjwYd19990aMWJEOusCACTB9dTEyy67THV1dRo8eLBWrFhx\nzLnm999/v0pKSnTRRRfp22+/dV1orks0737NmjWaNGmSJk2apJtvvlm7du3KQpWZ4fQahJaWFvl8\nPr399tsZrC6znLRFS0uLysrKNH78eAWDwcwWmEGJ2uLQoUO64447NGXKFF122WXasGFDFqr03sKF\nC3XyySfr/PPPP+Y2rnLTTsHkyZPthoYGe/fu3fZ5551n7927t8/3m5qa7BkzZti///67vXbtWruy\nsjKVw+W0RG3x8ccf23/88Ydt27b96quv2rfeems2ysyIRG1h27bd2dlpV1RU2JWVlfZbb72VhSoz\nI1FbdHd32xMnTrS3bNli27Yds61Mkagtamtr7ZqaGtu2bXv37t12SUmJ3d3dnY1SPdXY2Gh//vnn\n9sSJE2N+321uuu6ZHznX/Iwzzuida36kpqYmzZ8/X8XFxaqurtbOnTvdHi6nOWmLiy++uPdcQ2Vl\npRoaGjJeZyY4aQtJWrFihebPn6+RI0dmusSMcdIW27Zt0wUXXKDZs2dLkrHDlU7aYtiwYYpGozp8\n+LAikYiGDh06oGfnHMusWbMUCASO+X23uek6zJ3MNW9ublZpaWnv85EjR+qHH35we8icley8+xdf\nfFHz5s3LRGkZ56QtWltbtWHDBtXU1Ega2NPp4nHSFps3b5ZlWZo1a5bmzZunzZs3Z7rMjHDSFtXV\n1erq6tKIESM0c+ZMrVmzJtNl5gS3uenpPHPbtvtNUTT1g+tUfX29Vq9erY8//jjbpWTNsmXL9NRT\nT/XeHuvov5F80tHRoS+//FL19fU6ePCgrrjiCn3zzTcqLCzMdmkZt3LlSvl8Pv3222/6+uuvVVlZ\nqZ9//lmDBuXXeoBuc9N1K5WVlfUZmN++fbumT5/eZ5vy8nLt2LGj9/nevXtVUlLi9pA5y0lbSNJX\nX32lJUuW6N1339Xw4cMzWWLGOGmLzz77TFVVVTrrrLO0fv16LV26VO+++26mS/Wck7a4+OKLddVV\nV2nUqFEqKSnR1KlT1djYmOlSPeekLRobG3XLLbdo6NChKi8v16mnnmr0RIFjcZubrsPcyVzz8vJy\nrV+/Xr///rvWrl2r8ePHuz1cTnPSFr/88otuuOEGrVmzRuecc042yswIJ23x448/6qefftJPP/2k\n+fPnq7a2Vtdcc002yvWUk7aYPn26GhoadPDgQUUiEX3xxReaMWNGNsr1lJO2uPzyy/Xee++pu7tb\nP/74oyKRSJ+hmXzhNjdTGmaJNde8rq5OkrR48WJNmzZNM2fO1NSpU1VcXKzVq1encriclqgtHn30\nUUUiES1ZskSSNHjwYDU3N2ezZM8kaot8kqgtTjzxRC1YsEBTp07VyJEj9eijj+qEE07IctXeSNQW\nVVVV2rFjR29bPP/881mu2BvV1dVqaGjQvn37NHr0aD3yyCM6fPiwpNRy07LzecASAAyRX2cWAMBQ\nhDkAGIAwBwADEOYAYADCHAAMQJgDgAH+D2jpohxxMf4sAAAAAElFTkSuQmCC\n",
"text": "<matplotlib.figure.Figure at 0x26dd350>"
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": "# so, clearly, flip1 is biased. what about flip2 and flip3? they look *slightly* different...\n\nimport math\ndef avg(fliplist):\n return sum(fliplist) / float(len(fliplist))\n \ndef dev(fliplist):\n mean = avg(fliplist)\n diffs = []\n for k in fliplist:\n diffs.append((k - mean) ** 2)\n diffs = sum(diffs)\n diffs = math.sqrt(diffs / float(len(fliplist)))\n return diffs",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": "N = 1000000\nflip1_record = flip1(N)\nflip2_record = flip2(N)\nflip3_record = flip3(N)\n\nflip1_t = one_sample_t_test(avg(flip1_record), dev(flip1_record), len(flip1_record), 0.5)\nif flip1_t < p05_value:\n print 'flip1: fair'\nelse:\n print 'flip1: unfair'\n \n\nflip2_t = one_sample_t_test(avg(flip2_record), dev(flip2_record), len(flip2_record), 0.5)\nif flip2_t < p05_value:\n print 'flip2: fair'\nelse:\n print 'flip2: unfair'\n\n \nflip3_t = one_sample_t_test(avg(flip3_record), dev(flip3_record), len(flip3_record), 0.5)\nif flip3_t < p05_value:\n print 'flip3: fair'\nelse:\n print 'flip3: unfair'",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "flip1: unfair\nflip2: fair"
},
{
"output_type": "stream",
"stream": "stdout",
"text": "\nflip3: unfair"
},
{
"output_type": "stream",
"stream": "stdout",
"text": "\n"
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": "# curious to see what people did for the loop :)",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment