{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "

1  NetHack's functions Rne, Rn2 and Rnz in Python 3
1.1  Rn2 distribution
1.2  Rne distribution
1.3  Rnz distribution
1.4  Examples
1.4.1  For x=350
1.5  Conclusion
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# NetHack's functions Rne, Rn2 and Rnz in Python 3\n", "\n", "I liked [this blog post](https://eev.ee/blog/2018/01/02/random-with-care/#beware-gauss) by [Eevee](https://eev.ee/blog/).\n", "He wrote about interesting things regarding random distributions, and linked to [this page](https://nethackwiki.com/wiki/Rnz) which describes a weird distribution implemented as `Rnz` in the [NetHack](https://www.nethack.org/) game.\n", "\n", "> Note: I never heard of any of those before today.\n", "\n", "I wanted to implement and experiment with the `Rnz` distribution myself.\n", "Its code ([see here](https://nethackwiki.com/wiki/Source:NetHack_3.6.0/src/rnd.c#rnz)) uses two other distributions, `Rne` and `Rn2`." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The watermark extension is already loaded. To reload it, use:\n", " %reload_ext watermark\n", "CPython 3.6.3\n", "IPython 6.2.1\n", "\n", "numpy 1.13.3\n", "matplotlib 2.1.1\n", "\n", "compiler : GCC 7.2.0\n", "system : Linux\n", "release : 4.13.0-21-generic\n", "machine : x86_64\n", "processor : x86_64\n", "CPU cores : 4\n", "interpreter: 64bit\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -m -p numpy,matplotlib" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "import random\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `Rn2` distribution\n", "\n", "[The `Rn2` distribution](https://nethackwiki.com/wiki/Rn2) is simply an integer uniform distribution, between $0$ and $x-1$." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def rn2(x):\n", " return random.randint(0, x-1)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 9, 9, 0, 1, 9, 3, 1, 2, 7, 8, 6, 8, 3, 8, 4, 8, 6, 9, 7, 2, 2,\n", " 0, 9, 0, 7, 5, 0, 9, 4, 1, 1, 9, 2, 7, 3, 7, 4, 7, 3, 2, 0, 2, 8, 2,\n", " 0, 2, 0, 0, 7, 9, 9, 2, 7, 4, 9, 4, 3, 7, 9, 3, 3, 1, 2, 6, 6, 5, 5,\n", " 4, 0, 8, 9, 8, 1, 9, 5, 5, 9, 0, 6, 9, 5, 3, 1, 8, 4, 5, 8, 6, 9, 7,\n", " 9, 4, 1, 2, 0, 0, 9, 0])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rn2(10) for _ in range(100)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Testing for `rn2(x) == 0` gives a $1/x$ probability :" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "from collections import Counter" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({False: 91, True: 9})" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter([rn2(10) == 0 for _ in range(100)])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({False: 894, True: 106})" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter([rn2(10) == 0 for _ in range(1000)])" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({False: 9000, True: 1000})" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter([rn2(10) == 0 for _ in range(10000)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `Rne` distribution\n", "\n", "[The `Rne` distribution]() is a truncated geometric distribution." ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [], "source": [ "def rne(x, truncation=5):\n", " truncation = max(truncation, 1)\n", " tmp = 1\n", " while tmp < truncation and rn2(x) == 0:\n", " tmp += 1\n", " return tmp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> In the NetHack game, the player's experience is used as default value of the `truncation` parameter..." ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1,\n", " 2, 1, 2, 1, 4, 2, 1, 1, 1, 4, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1,\n", " 2, 1, 1, 2])" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rne(3) for _ in range(50)])" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([ 6610., 2268., 747., 252., 123.]),\n", " array([ 1. , 1.8, 2.6, 3.4, 4.2, 5. ]),\n", " )" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(np.asarray([rne(3) for _ in range(10000)]), bins=5)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([2, 1, 1, 3, 1, 2, 4, 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 6, 1, 2, 1,\n", " 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 4])" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rne(4, truncation=10) for _ in range(50)])" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([ 7.51300000e+03, 1.88900000e+03, 4.38000000e+02,\n", " 0.00000000e+00, 1.12000000e+02, 3.80000000e+01,\n", " 0.00000000e+00, 9.00000000e+00, 0.00000000e+00,\n", " 1.00000000e+00]),\n", " array([ 1. , 1.7, 2.4, 3.1, 3.8, 4.5, 5.2, 5.9, 6.6, 7.3, 8. ]),\n", " )" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAE05JREFUeJzt3W+MXfV95/H3pzg0Ce3GJsxarO2skWpR0ZUCrAVkU0W78cYYiGIetIhot1jIkvcBWyW7K3XJPrEKzYpIq6ZF2iIhcGu6WahLEmElKGTkUHUjLX/Mn5CAgzwhUNsLeBobUsI2WdLvPrg/pzfuDHMHz8wd+/d+SVf3nO/53XO+x4L5zDn3d++kqpAk9ecXxt2AJGk8DABJ6pQBIEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSp1aMu4G3c95559X69evH3YYknVaeeOKJv66qibnGLesAWL9+Pfv37x93G5J0Wkny0ijjvAUkSZ0yACSpUwaAJHXKAJCkThkAktQpA0CSOmUASFKnDABJ6pQBIEmdWtafBD5V62/+6liO++Jt14zluJI0H14BSFKnDABJ6pQBIEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSp+YMgCQXJnl66PHDJJ9Ocm6SySQH2/OqNj5Jbk8yleSZJJcO7WtbG38wybbFPDFJ0tubMwCq6vmquriqLgb+OfAm8GXgZmBfVW0A9rV1gKuADe2xA7gDIMm5wE7gcuAyYOeJ0JAkLb353gLaBHyvql4CtgK7W303cG1b3grcUwOPACuTnA9cCUxW1bGqOg5MAltO+QwkSe/IfAPgeuDetry6ql5uy68Aq9vyGuDQ0GsOt9psdUnSGIwcAEnOBj4B/PnJ26qqgFqIhpLsSLI/yf7p6emF2KUkaQbzuQK4Cniyql5t66+2Wzu056OtfgRYN/S6ta02W/3nVNWdVbWxqjZOTEzMoz1J0nzMJwA+yd/f/gHYC5yYybMNeGCofkObDXQF8Hq7VfQQsDnJqvbm7+ZWkySNwUh/ECbJOcDHgH83VL4N2JNkO/AScF2rPwhcDUwxmDF0I0BVHUtyK/B4G3dLVR075TOQJL0jIwVAVf0IeP9JtR8wmBV08tgCbpplP7uAXfNvU5K00PwksCR1ygCQpE4ZAJLUKQNAkjplAEhSpwwASeqUASBJnTIAJKlTBoAkdcoAkKROGQCS1CkDQJI6ZQBIUqcMAEnqlAEgSZ0yACSpUwaAJHXKAJCkThkAktSpkQIgycok9yf5bpIDST6U5Nwkk0kOtudVbWyS3J5kKskzSS4d2s+2Nv5gkm2LdVKSpLmNegXwh8DXqupXgQ8CB4CbgX1VtQHY19YBrgI2tMcO4A6AJOcCO4HLgcuAnSdCQ5K09OYMgCTvAz4C3A1QVT+pqteArcDuNmw3cG1b3grcUwOPACuTnA9cCUxW1bGqOg5MAlsW9GwkSSMb5QrgAmAa+OMkTyW5K8k5wOqqermNeQVY3ZbXAIeGXn+41War/5wkO5LsT7J/enp6fmcjSRrZKAGwArgUuKOqLgF+xN/f7gGgqgqohWioqu6sqo1VtXFiYmIhdilJmsEoAXAYOFxVj7b1+xkEwqvt1g7t+WjbfgRYN/T6ta02W12SNAZzBkBVvQIcSnJhK20CngP2Aidm8mwDHmjLe4Eb2mygK4DX262ih4DNSVa1N383t5okaQxWjDjut4EvJDkbeAG4kUF47EmyHXgJuK6NfRC4GpgC3mxjqapjSW4FHm/jbqmqYwtyFpKkeRspAKrqaWDjDJs2zTC2gJtm2c8uYNd8GpQkLQ4/CSxJnTIAJKlTBoAkdcoAkKROGQCS1CkDQJI6ZQBIUqcMAEnqlAEgSZ0yACSpUwaAJHXKAJCkThkAktQpA0CSOmUASFKnDABJ6pQBIEmdMgAkqVMjBUCSF5N8O8nTSfa32rlJJpMcbM+rWj1Jbk8yleSZJJcO7WdbG38wybbZjidJWnzzuQL4V1V1cVWd+NvANwP7qmoDsK+tA1wFbGiPHcAdMAgMYCdwOXAZsPNEaEiSlt6p3ALaCuxuy7uBa4fq99TAI8DKJOcDVwKTVXWsqo4Dk8CWUzi+JOkUjBoABXw9yRNJdrTa6qp6uS2/Aqxuy2uAQ0OvPdxqs9UlSWOwYsRxv15VR5L8Y2AyyXeHN1ZVJamFaKgFzA6AD3zgAwuxS0nSDEa6AqiqI+35KPBlBvfwX223dmjPR9vwI8C6oZevbbXZ6icf686q2lhVGycmJuZ3NpKkkc0ZAEnOSfLLJ5aBzcB3gL3AiZk824AH2vJe4IY2G+gK4PV2q+ghYHOSVe3N382tJkkag1FuAa0GvpzkxPj/WVVfS/I4sCfJduAl4Lo2/kHgamAKeBO4EaCqjiW5FXi8jbulqo4t2JlIkuZlzgCoqheAD85Q/wGwaYZ6ATfNsq9dwK75tylJWmh+EliSOmUASFKnDABJ6pQBIEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSpwwASeqUASBJnTIAJKlTBoAkdcoAkKROGQCS1CkDQJI6ZQBIUqcMAEnq1MgBkOSsJE8l+UpbvyDJo0mmkvxZkrNb/Rfb+lTbvn5oH59p9eeTXLnQJyNJGt18rgA+BRwYWv8c8Pmq+hXgOLC91bcDx1v9820cSS4Crgd+DdgC/FGSs06tfUnSOzVSACRZC1wD3NXWA3wUuL8N2Q1c25a3tnXa9k1t/Fbgvqr6cVV9H5gCLluIk5Akzd+oVwB/APwO8Hdt/f3Aa1X1Vls/DKxpy2uAQwBt++tt/M/qM7xGkrTE5gyAJB8HjlbVE0vQD0l2JNmfZP/09PRSHFKSujTKFcCHgU8keRG4j8Gtnz8EViZZ0casBY605SPAOoC2/X3AD4brM7zmZ6rqzqraWFUbJyYm5n1CkqTRzBkAVfWZqlpbVesZvIn7jar6N8DDwG+0YduAB9ry3rZO2/6NqqpWv77NEroA2AA8tmBnIkmalxVzD5nVfwbuS/J7wFPA3a1+N/CnSaaAYwxCg6p6Nske4DngLeCmqvrpKRxfknQK5hUAVfUXwF+05ReYYRZPVf0t8JuzvP6zwGfn26QkaeH5SWBJ6pQBIEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSpwwASeqUASBJnTIAJKlTBoAkdcoAkKROGQCS1CkDQJI6ZQBIUqcMAEnqlAEgSZ2aMwCSvDvJY0m+leTZJL/b6hckeTTJVJI/S3J2q/9iW59q29cP7eszrf58kisX66QkSXMb5Qrgx8BHq+qDwMXAliRXAJ8DPl9VvwIcB7a38duB463++TaOJBcx+APxvwZsAf4oyVkLeTKSpNHNGQA18EZbfVd7FPBR4P5W3w1c25a3tnXa9k1J0ur3VdWPq+r7wBQz/FF5SdLSGOk9gCRnJXkaOApMAt8DXquqt9qQw8CatrwGOATQtr8OvH+4PsNrJElLbKQAqKqfVtXFwFoGv7X/6mI1lGRHkv1J9k9PTy/WYSSpe/OaBVRVrwEPAx8CViZZ0TatBY605SPAOoC2/X3AD4brM7xm+Bh3VtXGqto4MTExn/YkSfMwyiygiSQr2/J7gI8BBxgEwW+0YduAB9ry3rZO2/6NqqpWv77NEroA2AA8tlAnIkmanxVzD+F8YHebsfMLwJ6q+kqS54D7kvwe8BRwdxt/N/CnSaaAYwxm/lBVzybZAzwHvAXcVFU/XdjTkSSNas4AqKpngEtmqL/ADLN4qupvgd+cZV+fBT47/zYlSQvNTwJLUqcMAEnqlAEgSZ0yACSpUwaAJHXKAJCkThkAktQpA0CSOmUASFKnDABJ6pQBIEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSpwwASeqUASBJnZozAJKsS/JwkueSPJvkU61+bpLJJAfb86pWT5Lbk0wleSbJpUP72tbGH0yybfFOS5I0l1GuAN4C/lNVXQRcAdyU5CLgZmBfVW0A9rV1gKuADe2xA7gDBoEB7AQuZ/DH5HeeCA1J0tKbMwCq6uWqerIt/w1wAFgDbAV2t2G7gWvb8lbgnhp4BFiZ5HzgSmCyqo5V1XFgEtiyoGcjSRrZvN4DSLIeuAR4FFhdVS+3Ta8Aq9vyGuDQ0MsOt9psdUnSGIwcAEl+Cfgi8Omq+uHwtqoqoBaioSQ7kuxPsn96enohdilJmsFIAZDkXQx++H+hqr7Uyq+2Wzu056OtfgRYN/Tyta02W/3nVNWdVbWxqjZOTEzM51wkSfMwyiygAHcDB6rq94c27QVOzOTZBjwwVL+hzQa6Ani93Sp6CNicZFV783dzq0mSxmDFCGM+DPwW8O0kT7fafwFuA/Yk2Q68BFzXtj0IXA1MAW8CNwJU1bEktwKPt3G3VNWxBTmLZWb9zV8dy3FfvO2asRxX0ulpzgCoqm8CmWXzphnGF3DTLPvaBeyaT4OSpMXhJ4ElqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSpwwASeqUASBJnTIAJKlTBoAkdcoAkKROGQCS1CkDQJI6ZQBIUqcMAEnqlAEgSZ0yACSpUwaAJHXKAJCkTs0ZAEl2JTma5DtDtXOTTCY52J5XtXqS3J5kKskzSS4des22Nv5gkm2LczqSpFGNcgXwJ8CWk2o3A/uqagOwr60DXAVsaI8dwB0wCAxgJ3A5cBmw80RoSJLGY84AqKq/BI6dVN4K7G7Lu4Frh+r31MAjwMok5wNXApNVdayqjgOT/MNQkSQtoXf6HsDqqnq5Lb8CrG7La4BDQ+MOt9ps9X8gyY4k+5Psn56efoftSZLmcspvAldVAbUAvZzY351VtbGqNk5MTCzUbiVJJ3mnAfBqu7VDez7a6keAdUPj1rbabHVJ0pi80wDYC5yYybMNeGCofkObDXQF8Hq7VfQQsDnJqvbm7+ZWkySNyYq5BiS5F/iXwHlJDjOYzXMbsCfJduAl4Lo2/EHgamAKeBO4EaCqjiW5FXi8jbulqk5+Y1mStITmDICq+uQsmzbNMLaAm2bZzy5g17y6kyQtGj8JLEmdMgAkqVMGgCR1ygCQpE4ZAJLUKQNAkjplAEhSpwwASeqUASBJnTIAJKlTc34VhE4f62/+6tiO/eJt14zt2JLeGa8AJKlTBoAkdcoAkKROGQCS1CkDQJI6ZQBIUqcMAEnq1JIHQJItSZ5PMpXk5qU+viRpYEk/CJbkLOC/Ax8DDgOPJ9lbVc8tZR86c/jhN+mdW+orgMuAqap6oap+AtwHbF3iHiRJLP1XQawBDg2tHwYuX+IepAUxrqsPrzy0UJbddwEl2QHsaKtvJHn+FHZ3HvDXp97VkjideoWT+s3nxtjJ3E6nf9s5e11m/9Zn1L/tMnMq/f7TUQYtdQAcAdYNra9ttZ+pqjuBOxfiYEn2V9XGhdjXYjudeoXTq197XTynU7+nU6+wNP0u9XsAjwMbklyQ5GzgemDvEvcgSWKJrwCq6q0k/x54CDgL2FVVzy5lD5KkgSV/D6CqHgQeXKLDLcitpCVyOvUKp1e/9rp4Tqd+T6deYQn6TVUt9jEkScuQXwUhSZ064wIgya4kR5N8Z9y9jCLJuiQPJ3kuybNJPjXunmaT5N1JHkvyrdbr7467p7kkOSvJU0m+Mu5e5pLkxSTfTvJ0kv3j7mcuSVYmuT/Jd5McSPKhcfc0kyQXtn/TE48fJvn0uPuaTZL/0P7/+k6Se5O8e9GOdabdAkryEeAN4J6q+mfj7mcuSc4Hzq+qJ5P8MvAEcO1y/HqMJAHOqao3krwL+Cbwqap6ZMytzSrJfwQ2Av+oqj4+7n7eTpIXgY1VdVrMVU+yG/hfVXVXm9X33qp6bdx9vZ32dTRHgMur6qVx93OyJGsY/H91UVX93yR7gAer6k8W43hn3BVAVf0lcGzcfYyqql6uqifb8t8ABxh8YnrZqYE32uq72mPZ/gaRZC1wDXDXuHs50yR5H/AR4G6AqvrJcv/h32wCvrccf/gPWQG8J8kK4L3A/1msA51xAXA6S7IeuAR4dLydzK7dUnkaOApMVtWy7RX4A+B3gL8bdyMjKuDrSZ5on4hfzi4ApoE/brfY7kpyzribGsH1wL3jbmI2VXUE+G/AXwEvA69X1dcX63gGwDKR5JeALwKfrqofjruf2VTVT6vqYgaf4r4sybK8zZbk48DRqnpi3L3Mw69X1aXAVcBN7XbmcrUCuBS4o6ouAX4ELOuvd2+3qT4B/Pm4e5lNklUMviDzAuCfAOck+beLdTwDYBlo99O/CHyhqr407n5G0S73Hwa2jLuXWXwY+ES7r34f8NEk/2O8Lb299tsfVXUU+DKDb89drg4Dh4euAO9nEAjL2VXAk1X16rgbeRv/Gvh+VU1X1f8DvgT8i8U6mAEwZu2N1buBA1X1++Pu5+0kmUiysi2/h8HfdfjueLuaWVV9pqrWVtV6Bpf936iqRftN6lQlOadNAqDdStkMLNuZbFX1CnAoyYWttAlYdhMXTvJJlvHtn+avgCuSvLf9bNjE4H3BRXHGBUCSe4H/DVyY5HCS7ePuaQ4fBn6LwW+oJ6apXT3upmZxPvBwkmcYfK/TZFUt++mVp4nVwDeTfAt4DPhqVX1tzD3N5beBL7T/Hi4G/uuY+5lVC9WPMfiNetlqV1T3A08C32bwM3rRPhF8xk0DlSSN5oy7ApAkjcYAkKROGQCS1CkDQJI6ZQBIUqcMAEnqlAEgSZ0yACSpU/8f7pGKegFJJdwAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(np.asarray([rne(4, truncation=10) for _ in range(10000)]), bins=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check what [this page](https://nethackwiki.com/wiki/Rnz#Probability_density_function) says about `rne(4)`:\n", "\n", "> The rne(4) call returns an integer from 1 to 5, with the following probabilities:\n", ">\n", "> |Number| Probability |\n", "> |:-----|------------:|\n", "> | 1 | 3/4 |\n", "> | 2 | 3/16 |\n", "> | 3 | 3/64 |\n", "> | 4 | 3/256 |\n", "> | 5 | 1/256 | " ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: 0.75, 2: 0.1875, 3: 0.046875, 4: 0.01171875, 5: 0.00390625}" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ref_table = {1: 3/4, 2: 3/16, 3: 3/64, 4: 3/256, 5: 1/256}\n", "ref_table" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: 0.7498, 2: 0.18791, 3: 0.04641, 4: 0.0117, 5: 0.00418}" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = 100000\n", "table = Counter([rne(4, truncation=5) for _ in range(N)])\n", "for k in table:\n", " table[k] /= N\n", "table = dict(table)\n", "table" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "For k=1: relative difference is 0.000267 between 0.75 (expectation) and 0.75 (with N=100000 samples).\n", "For k=2: relative difference is 0.00219 between 0.188 (expectation) and 0.188 (with N=100000 samples).\n", "For k=3: relative difference is 0.00992 between 0.0469 (expectation) and 0.0464 (with N=100000 samples).\n", "For k=4: relative difference is 0.0016 between 0.0117 (expectation) and 0.0117 (with N=100000 samples).\n", "For k=5: relative difference is 0.0701 between 0.00391 (expectation) and 0.00418 (with N=100000 samples).\n" ] } ], "source": [ "rel_diff = lambda x, y: abs(x - y) / x\n", "for k in ref_table:\n", " x, y = ref_table[k], table[k]\n", " r = rel_diff(x, y)\n", " print(f\"For k={k}: relative difference is {r:.3g} between {x:.3g} (expectation) and {y:.3g} (with N={N} samples).\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> Seems true !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `Rnz` distribution\n", "\n", "It's not too hard to write." ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [], "source": [ "def rnz(i, truncation=10):\n", " x = i\n", " tmp = 1000\n", " tmp += rn2(1000)\n", " tmp *= rne(4, truncation=truncation)\n", " flip = rn2(2)\n", " if flip:\n", " x *= tmp\n", " x /= 1000\n", " else:\n", " x *= 1000\n", " x /= tmp\n", " return int(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Examples" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 5, 2, 1, 1, 2, 5, 3, 0, 3, 2, 2, 5, 5, 3, 0, 1, 3,\n", " 4, 4, 1, 4, 2, 6, 4, 3, 3, 8, 2, 3, 5, 2, 4, 1, 4,\n", " 4, 2, 4, 1, 1, 3, 1, 2, 0, 5, 1, 2, 5, 14, 2, 1, 0,\n", " 1, 5, 17, 2, 3, 1, 1, 1, 4, 13, 1, 4, 4, 2, 5, 5, 1,\n", " 2, 0, 4, 4, 0, 5, 20, 6, 2, 3, 5, 2, 1, 3, 2, 5, 0,\n", " 2, 5, 1, 4, 2, 1, 1, 2, 2, 11, 2, 1, 5, 5, 1])" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rnz(3) for _ in range(100)])" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 6, 5, 5, 5, 2, 16, 2, 1, 3, 2, 5, 3, 2, 5, 0, 4, 2,\n", " 2, 4, 3, 10, 4, 5, 1, 1, 2, 5, 10, 1, 1, 0, 5, 4, 5,\n", " 1, 7, 16, 1, 3, 5, 3, 1, 11, 2, 10, 9, 4, 1, 8, 4, 1,\n", " 1, 4, 0, 2, 5, 2, 2, 7, 2, 10, 2, 7, 5, 1, 10, 2, 4,\n", " 3, 1, 1, 6, 10, 2, 2, 0, 4, 1, 4, 3, 1, 4, 3, 2, 3,\n", " 5, 1, 5, 0, 1, 2, 10, 5, 1, 3, 2, 1, 2, 1, 1])" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rnz(3, truncation=10) for _ in range(100)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### For `x=350`" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 668, 511, 360, 1548, 211, 495, 321, 180, 667, 1339, 179,\n", " 257, 696, 192, 211, 134, 312, 164, 202, 206, 299, 316,\n", " 182, 566, 445, 392, 363, 592, 656, 605, 676, 287, 704,\n", " 1190, 253, 118, 359, 142, 331, 586, 597, 204, 196, 60,\n", " 178, 1605, 606, 692, 187, 486, 696, 624, 182, 322, 260,\n", " 580, 1283, 100, 663, 89, 465, 305, 420, 436, 500, 93,\n", " 178, 348, 489, 499, 227, 1143, 187, 220, 513, 193, 1270,\n", " 461, 299, 323, 679, 729, 1301, 910, 509, 1006, 2071, 1575,\n", " 183, 44, 229, 119, 515, 327, 87, 281, 638, 177, 208,\n", " 114])" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rnz(350) for _ in range(100)])" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_ = plt.hist(np.asarray([rnz(350) for _ in range(100000)]), bins=200)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1288, 58, 27, 2349, 4723, 2011, 1767, 2200, 1685, 19, 2873,\n", " 66, 884, 1517, 159, 2758, 4657, 957, 225, 32, 2626, 176,\n", " 1000, 737, 2353, 50, 928, 67, 52, 1543, 229, 34, 3725,\n", " 75, 163, 2431, 3307, 460, 2144, 1411, 108, 131, 2447, 1170,\n", " 2024, 32, 431, 98, 489, 2417, 210, 5569, 963, 132, 479,\n", " 195, 3752, 257, 4429, 1219, 446, 153, 619, 18, 105, 144,\n", " 1520, 40, 2608, 260, 412, 1755, 1057, 99, 64, 322, 1981,\n", " 112, 146, 53, 56, 1270, 1808, 4517, 1598, 79, 1355, 6954,\n", " 2075, 3458, 64, 1061, 176, 474, 1309, 3260, 4118, 19, 260,\n", " 872])" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray([rnz(350, truncation=10) for _ in range(100)])" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_ = plt.hist(np.asarray([rnz(350, truncation=10) for _ in range(10000)]), bins=200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "That's it, not so interesting but I wanted to write this." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" }, "toc": { "colors": { "hover_highlight": "#DAA520", "running_highlight": "#FF0000", "selected_highlight": "#FFD700" }, "moveMenuLeft": true, "nav_menu": { "height": "178px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }