{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import time\n", "\n", "from our_random import test" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "seed = .123\n", "def rand():\n", " \"\"\"Our very own random number generator.\"\"\"\n", " \n", " # The seed is always a number between 0 and 1.\n", " global seed\n", " \n", " # Get the time as a floating point number in seconds, multiply it by the seed\n", " # (after adding 1.0 to the seed so we never multiple by 0), and get the 10\n", " # digits after the decimal as a string in reverse order (so the quickest\n", " # changing digit is first.\n", " tmp = time.time() * (1.0 + seed)\n", " tmp = tmp - int(tmp)\n", " digits = ''.join(reversed(\"{:.10f}\".format(tmp)[2:]))\n", " \n", " # Prepend '0.' to the digits as our random number and save it as the seed for\n", " # next time.\n", " result = float('0.' + str(digits))\n", " seed = result\n", " return result" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "# Number of random numbers to generate for each test.\n", "NUM_TEST_SAMPLES = 1000000\n", "\n", "# Do a single test of our random number generator and plot a histogram.\n", "numbers = np.array([rand() for _ in xrange(NUM_TEST_SAMPLES)])\n", "NUM_BINS = 100\n", "plt.hist(numbers, bins=NUM_BINS)\n", "plt.axhline(y=(NUM_TEST_SAMPLES / float(NUM_BINS)), color='red')\n", "print 'pvalue', test(numbers)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "pvalue " ] }, { "output_type": "stream", "stream": "stdout", "text": [ "0.0510114145228\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\ncqqvr0/z5s0r+YnClFLavHlzOu+889KECRPShAkTUmtra+ru7i5p89RTT6W5c+em+vr6NHny5HTx\nxRen1157bccHFZFGjBi13TJ69Nhd8gDs/Elfyy/k1TC+t5vfyj0xh7vecD9W5c378F+wy3nsh3du\nh/v5WO3Xi+F/QRn8jf1wznv1BIOdnaPq76s6nnPlvaGpjmtnJR/7cua2Wp4j5dbbkfJ/1rKy15+h\nKLx5Eu1W3vjnh97t1k+YMDO2bFkbbzwO2+01wPpytw13vcH7Guhh3BX/lJl/fIP3Ndg+Oz+Oavon\nsEqMr/y+dnYc1fXPi/mfI9VSL/+8V3+9Sl7PKvkcrtxjP/y3bQzvXAw2vlERMdD//l3N520l+9oV\n50X1z8VQ4vQu+TWV6jB6uzWFQtm/5Fjlqv0XFap9fOXaXY8L2PNU8nr2dr+2kVs5vwZSDeOudcP7\nK0C1ZDcO43uSWr+w1ard9biGmzcttcNj9fZ21zlyPYNchHH2ILvri+hAquV499xPO2qPQPb2zBEw\nvIRx9iB72ovonna8sLupljfUwK4kjANAVfKGGvYEu+s3GgEAoOr5ZByoQv55HoA9gzAOVCH/PA/A\nnsFtKgAAkIkwDgAAmQjjAACQiTAOAACZCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAOAACZ\nCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAOAACZCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjj\nAACQiTAOAACZCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAOAACZCOMAAJCJMA4AAJkI4wAA\nkIkwDgAAmQjjAACQiTAOAACZCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAOAACZCOMAAJCJ\nMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAOAACZCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAO\nAACZCOMAAJCJMA4AAJkI4wAAkIkwDgAAmQjjAACQiTAOAACZDDmMv/766/Gv//qvcdBBB8XYsWPj\noIMOiq985SvR19dX0m7x4sUxbdq0qK+vj5NOOik2bNhQsr23tzcWLVoUU6ZMiYaGhpg/f34888wz\nJW02b94cra2tMWnSpJg0aVIsXLgwuru7h3oIAACQxZDD+JIlS2LZsmVx7bXXxqOPPhrf+c534vrr\n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\nccdFS0tL/Md//Ed0dnbGpz/96dxDAwCAnVZTYfzss8+Ol156Kb7xjW/Ec889F0ceeWTcfvvt8Y53\nvCP30AAAYKfV1O+MAwDA7qRmftrwra6//vo48MADY+zYsXHsscdGW1vboO0feuihmDVrVtTX10dz\nc3N8/etfr9BIqaSdOS/uvffemD9/fuy///4xbty4OOqoo+KGG26o4GiplJ29XvzZY489FuPHj4/x\n48fv4hGSQznnxbe//e1497vfHWPGjIn9998/vvSlL1VgpFTKzp4Tt99+e7zvfe+LCRMmxJQpU+KD\nH/xgPPbYYxUaLZVw3333xbx586K5uTnq6urixhtvfNt9ysqcqcbcfPPNadSoUekHP/hB2rhxY1q0\naFFqaGhITz311A7bd3d3p6lTp6YFCxakRx55JN16661p/Pjx6Vvf+laFR86utLPnxZIlS9JXvvKV\n1N7enp544on07//+72nkyJFp+fLlFR45u9LOnhd/1tvbm4455ph0xhlnpPHjx1dotFRKOefF5z//\n+fSud70r/eIXv0hPPPFEWr9+ffr1r39dwVGzK+3sOfHYY4+lUaNGpS984Qvpj3/8Y1q/fn069dRT\n0yGHHFLhkbMr3X777enLX/5yuvXWW1N9fX268cYbB21fbuasuTB+3HHHpQsuuKBk3aGHHpq+9KUv\n7bD99ddfnyZOnJheffXV4rpvfOMbadq0abt0nFTWzp4XO3L22WenD3/4w8M9NDIq97y45JJL0ic+\n8Yn0wx/+MDU0NOzKIZLBzp4XGzduTKNGjUobN26sxPDIYGfPiZ/97GdpxIgRqb+/v7ju7rvvToVC\nIb300ku7dKzk0dDQ8LZhvNzMWVO3qbz22muxdu3amDNnTsn6OXPmRHt7+w736ejoiPe///2x1157\nlbR/9tln48knn9yl46UyyjkvdqS7uzv22Wef4R4emZR7Xtx2221x2223xbXXXhvJV2p2O+WcFz//\n+c/joIMOittvvz0OOuigOPDAA+P888+PF154oRJDZhcr55w4/vjjo6GhIb7//e9HX19f/OlPf4of\n/vCHcdxxx3kd2YOVmzlrKoy/+OKL0dfXF1OnTi1Z39jYGJ2dnTvcp7Ozc7v2f/77QPtQW8o5L/7S\nr371q7j77rvjggsu2BVDJINyzotnn302Lrjggvjxj38c9fX1lRgmFVbOefH444/Hk08+Gbfcckv8\n53/+Z9x0002xcePGOPPMM71h2w2Uc07st99+cfvtt8cVV1wRY8aMiUmTJsUjjzwSv/zlLysxZKpU\nuZmzpsJ4OQqFwf4nJYj47W9/Gx/72Mfi2muvjWOPPTb3cMiotbU1Lrroonjve9+beyhUkf7+/ujt\n7Y2bbropTjjhhDjhhBPipptuiv/93/+NBx54IPfwyODxxx+PD37wg/Hxj388Hnjggbj33ntj/Pjx\ncfbZZ3uDtgcrN3PWVBjfd999Y8SIEdHV1VWyvqurK/bbb78d7tPU1LTdu5E/79/U1LRrBkpFlXNe\n/FlbW1t84AMfiK9//etx4YUX7sphUmHlnBf33HNPfO1rX4tRo0bFqFGj4lOf+lRs3bo1Ro0aFT/4\nwQ8qMWx2sXLOi/322y9GjhwZhxxySHHdIYccEiNGjIinnnpql46XXa+cc2LZsmXxjne8I5YuXRpH\nHXVUvP/9748f/ehH8Zvf/CY6OjoqMWyqULmZs6bC+OjRo2PGjBmxatWqkvV33nlntLS07HCfmTNn\nxurVq6O3t7ek/bRp0+Kd73znLh0vlVHOeRHxxk8WfeADH4ivfe1r8bnPfW5XD5MKK+e8ePjhh+PB\nBx8sLldeeWWMHTs2HnzwwfjIRz5SiWGzi5VzXpxwwgnx+uuvx+OPP15c9/jjj0dfX5/Xkd1AOedE\nSinq6koj1J//3t/fv2sGStUrO3MO+eulFfbTn/40jR49Ov3gBz9IGzZsSJ/73OfS+PHjiz8/9MUv\nfjH9wz/8Q7F9d3d3ampqSh/96EfTww8/nP7rv/4rTZgwIV1zzTW5DoFdYGfPi3vuuSfV19enyy+/\nPHV2dqbnnnsuPffcc+n555/PdQjsAjt7XvylG264wa+p7IZ29rzo7+9PM2bMSLNmzUrr1q1La9eu\nTSeeeGKaOXNmrkNgmO3sObF69epUV1eXrrzyyvT73/8+rVmzJp166qnpne98Z/q///u/XIfBMOvp\n6Unr1q1L69atS/X19enKK69M69atG/bMWXNhPKU3fjrmgAMOSHvttVc69thj0+rVq4vbzj///HTg\ngQeWtH/ooYfSiSeemMaMGZP233//dOWVV1Z6yFTAzpwX559/fqqrq0uFQqFk+ctzh9q3s9eLt7rh\nhhv8zvhuamfPi+eeey6dddZZafz48amxsTGdd9553rzvZnb2nPjZz36WZsyYkRoaGlJjY2OaP39+\n+t3vflfpYbML3XPPPcV88NbM8PGPfzylNHyZs5CSbxoAAEAONXXPOAAA7E6EcQAAyEQYBwCATIRx\nAADIRBgHAIBMhHEAAMhEGAcAgEyEcQAAyEQYBwCATP5/EBU5yJTeFfcAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# Define some functions to test our random number generator as well as\n", "# numpy's generator. For each generator, we call the provided test\n", "# function 'NUM_EXPERIMENTS' times with 'NUM_TEST_SAMPLES' random\n", "# samples and then summarize the results.\n", "\n", "NUM_EXPERIMENTS = 100\n", "\n", "def test_our_random():\n", " \"\"\"Get the p-value for a single test of our generator.\"\"\"\n", " return test([rand() for _ in xrange(NUM_TEST_SAMPLES)])\n", "\n", "def test_numpy_random():\n", " \"\"\"Get the p-value for a single test of numpy's generator.\"\"\"\n", " return test(np.random.random(NUM_TEST_SAMPLES))\n", "\n", "def get_pvals(test_func):\n", " \"\"\"Return an array of p-values from the given test function.\"\"\"\n", " pvals = np.array([test_func() for _ in xrange(NUM_EXPERIMENTS)])\n", " return pvals\n", "\n", "def summarize_results(name, pvals):\n", " \"\"\"Print a summary of the results from an array of p-values.\"\"\"\n", " print \"{} results:\".format(name)\n", " print \" mean: {}\".format(np.mean(pvals))\n", " print \" std: {}\".format(np.std(pvals))\n", " print \" pvals: {}\".format(\" \".join(\"{:.2f}\".format(pval) for pval in pvals))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# Summarize numpy's results.\n", "numpy_pvals = get_pvals(test_numpy_random)\n", "summarize_results('numpy', numpy_pvals)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "numpy results:\n", " mean: 0.552962303605\n", " std: 0.29984188423\n", " pvals: 0.98 0.99 0.48 0.64 0.98 0.42 0.97 0.78 0.89 0.05 0.98 0.88 0.79 0.61 0.70 0.62 0.15 0.61 0.04 0.94 0.86 0.21 0.98 0.69 0.90 0.70 0.09 0.37 0.31 0.73 0.34 0.31 0.70 0.96 0.48 0.31 0.76 0.12 0.08 0.74 0.21 0.57 0.62 0.99 0.16 0.97 0.61 0.46 0.76 0.63 0.83 0.01 0.49 0.70 0.98 0.18 0.64 0.16 0.33 0.84 0.43 0.41 0.72 0.44 0.92 0.44 0.28 0.90 0.81 0.64 0.09 0.01 0.24 0.31 0.71 0.75 0.69 0.84 0.96 0.01 0.53 0.17 0.78 0.58 0.47 0.85 0.47 0.06 0.97 0.48 0.79 0.30 0.18 0.05 0.17 0.81 0.40 0.71 0.44 0.21\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "# Summarize our results. Takes quite a few minutes to run.\n", "our_pvals = get_pvals(test_our_random)\n", "summarize_results('our', our_pvals)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "our results:\n", " mean: 0.503211314223\n", " std: 0.284857700816\n", " pvals: 0.65 0.85 0.08 0.83 0.41 0.85 0.83 0.57 0.04 0.85 1.00 0.28 0.04 0.73 0.07 0.78 0.47 0.19 0.44 0.71 0.04 0.05 0.08 0.85 0.58 0.09 0.53 0.27 0.83 0.48 0.37 0.45 0.37 0.13 0.46 0.08 0.74 0.86 0.21 0.99 0.54 0.25 0.31 0.78 0.53 0.59 0.67 0.38 0.19 0.05 0.85 0.54 0.84 0.52 0.22 0.53 0.98 0.95 0.74 0.86 0.56 0.17 0.20 0.00 0.26 0.65 0.23 0.75 0.27 0.74 0.88 0.82 0.62 0.62 0.54 0.94 0.38 0.44 0.29 0.13 0.45 0.65 0.68 0.19 0.32 0.71 0.32 0.23 0.92 0.26 0.26 0.93 0.65 0.43 0.57 0.42 0.93 0.05 0.65 0.77\n" ] } ], "prompt_number": 6 } ], "metadata": {} } ] }