{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Päivitetty 2025-08-26 / Aki Taanila\n" ] } ], "source": [ "from datetime import datetime\n", "print(f'Päivitetty {datetime.now().date()} / Aki Taanila')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kolikon heittoa\n", "\n", "Simuloin kolikon heittoa miljoona kertaa tuottamalla sattumanvaraisesti nollia ja ykkösiä. Tulokset tallennan heitot-nimiseen muuttujaan." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Kruunuja: 500599, Klaavoja: 499401\n" ] } ], "source": [ "# Alustan satunnaislukugeneraattorin:\n", "rng = np.random.default_rng()\n", "\n", "heitot = rng.integers(low=0, high=2, size=1000000)\n", "\n", "print(f'Kruunuja: {np.sum(heitot)}, Klaavoja: {np.sum(1 - heitot)}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Muodostan listan, joka kertoo kuinka monta kertaa sama tulos tulee peräkkäin. Jos esimerkiksi tulee kolme klaavaa, sitten yksi kruunu ja sen jälkeen neljä klaavaa, niin listaan tulee 3, 1, 4. Listan nimeksi annan sarjat." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "sarjat = []\n", "sarja = 1\n", "\n", "for i in range(len(heitot) - 1):\n", " if heitot[i] == heitot[i + 1]:\n", " sarja += 1\n", " else:\n", " sarjat.append(sarja)\n", " sarja = 1\n", "sarjat.append(sarja)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lasken sarjat-listassa esiintyvien lukujen lukumäärät. Kuten huomaat, niin jopa yli kymmenen peräkkäisen kruunun tai klaavan sarjoja on melko paljon." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
lkm
1249690
2125178
362348
431468
515625
67771
73938
81892
9990
10461
11247
12130
1362
1427
1518
1611
176
182
201
\n", "
" ], "text/plain": [ " lkm\n", "1 249690\n", "2 125178\n", "3 62348\n", "4 31468\n", "5 15625\n", "6 7771\n", "7 3938\n", "8 1892\n", "9 990\n", "10 461\n", "11 247\n", "12 130\n", "13 62\n", "14 27\n", "15 18\n", "16 11\n", "17 6\n", "18 2\n", "20 1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import Counter\n", "\n", "laskuri = Counter(sarjat)\n", "\n", "pd.DataFrame(data = Counter(laskuri).values(), index = Counter(laskuri).keys(), columns = ['lkm']).sort_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kahden nopan heittoa\n", "\n", "Seuraavassa heitän kahta noppaa tuhat kertaa ja tallennan tulokset heitot-nimiseen muuttujaan.\n", "\n", "Lasken eri silmälukujen määrät kummallekin nopalle ja parien määrät." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ekatokapareja
Silmäluku
116817232
217016938
317016031
418018835
514916119
616315026
\n", "
" ], "text/plain": [ " eka toka pareja\n", "Silmäluku \n", "1 168 172 32\n", "2 170 169 38\n", "3 170 160 31\n", "4 180 188 35\n", "5 149 161 19\n", "6 163 150 26" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Kahden nopan heittoa 1000 kertaa\n", "heitot = rng.integers(low=1, high=7, size=(1000, 2))\n", "\n", "# dataframe tulosten esittämistä varten\n", "tulokset = pd.DataFrame(columns = ['eka', 'toka', 'pareja'])\n", "\n", "# for silmukka käy läpi silmälukujen arvot 1 - 6\n", "for i in range(1, 7):\n", " eka = heitot[:,0] == i # ensimmäinen noppa\n", " toka = heitot[:,1] == i # toinen noppa\n", " pareja = eka & toka # pari (molemmilla sama tulos)\n", " \n", " # Lisätään silmälukuun liittyvät lukumäärät dataframeen\n", " tulokset_uusi_rivi = pd.DataFrame({'eka' : eka.sum(), \n", " 'toka' : toka.sum(), 'pareja' : pareja.sum()}, index = [i])\n", " tulokset = pd.concat([tulokset, tulokset_uusi_rivi])\n", "\n", "tulokset.index.name = 'Silmäluku'\n", "tulokset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esitän lopuksi kahden nopan silmälukujen summan jakauman" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAG0CAYAAADU2ObLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQjhJREFUeJzt3XlY1XXC/vH7yyKCiKDINiGi5qS562TqlOIa7mmaWamjNdW0qZVlaYDlUv0ezXTGycY1K61JfTQ1l9wqs0nKtU0NlRJyXBFQRPj8/vDyPJ5Y5MA5HDi9X9d1rovvcj7nPgKH2+9qGWOMAAAAPJSXuwMAAAC4EmUHAAB4NMoOAADwaJQdAADg0Sg7AADAo1F2AACAR6PsAAAAj+bj7gAVQX5+vo4fP67q1avLsix3xwEAACVgjNH58+cVFRUlL6+it99QdiQdP35c0dHR7o4BAABKITU1VTfccEORyyk7kqpXry7pyj9WUFCQm9MAAICSyMjIUHR0tO3veFEoO5Jt11VQUBBlBwCASuZ6h6BwgDIAAPBolB0AAODRKDsAAMCjUXYAAIBHo+wAAACPRtkBAAAejbIDAAA8GmUHAAB4NMoOAADwaJQdAADg0Sg7AADAo1F2AACAR6PsAAAAj0bZAQAAHo2yAwAAPJqPuwMAQGnUfW6NS8Y9Mq2XS8YF4D5s2QEAAB6NsgMAADwaZQcAAHg0yg4AAPBolB0AAODRKDsAAMCjUXYAAIBHo+wAAACPRtkBAAAejbIDAAA8GmUHAAB4NMoOAADwaG4tO9u3b1efPn0UFRUly7K0cuVKu+WWZRX6eO2112zrdOrUqcDyIUOGlPM7AQAAFZVby05WVpaaN2+u2bNnF7o8LS3N7jF//nxZlqWBAwfarffggw/arffmm2+WR3wAAFAJ+LjzxePj4xUfH1/k8oiICLvp//3f/1VcXJzq1atnNz8gIKDAugAAAJKby44jfv31V61Zs0aLFi0qsOydd97RkiVLFB4ervj4eCUkJKh69epFjpWTk6OcnBzbdEZGhiQpNzdXubm5zg8PoNLgMwCoPEr6+1ppys6iRYtUvXp1DRgwwG7+vffeq9jYWEVERGj//v0aP3689uzZo40bNxY51tSpU5WUlFRg/oYNGxQQEOD07ABcwTUfX2vXrnXJuACcLzs7u0TrWcYY4+IsJWJZllasWKH+/fsXuvymm25St27dNGvWrGLHSU5OVps2bZScnKxWrVoVuk5hW3aio6N18uRJBQUFlfo9ACg/N07c4JJxD77U3SXjAnC+jIwMhYaG6ty5c8X+/a4UW3Y+/fRT/fDDD1q2bNl1123VqpV8fX118ODBIsuOn5+f/Pz8Csz39fWVr69vmfMCqLz4DAAqj5L+vlaK6+zMmzdPrVu3VvPmza+77oEDB5Sbm6vIyMhySAYAACo6t27ZyczM1KFDh2zTKSkp2r17t2rWrKk6depIurKJ6oMPPtD//M//FHj+4cOH9c4776hnz54KDQ3Vt99+q6eeekotW7ZUhw4dyu19AACAisutZWfXrl2Ki4uzTY8dO1aSNHz4cC1cuFCStHTpUhljdM899xR4fpUqVfTJJ59o5syZyszMVHR0tHr16qWEhAR5e3uXy3sAAAAVW4U5QNmdMjIyVKNGjese4ASg4qj73BqXjHtkWi+XjAvA+Ur697tSHLMDAABQWpQdAADg0Sg7AADAo1F2AACAR6PsAAAAj0bZAQAAHo2yAwAAPBplBwAAeDTKDgAA8GiUHQAA4NEoOwAAwKNRdgAAgEej7AAAAI9G2QEAAB6NsgMAADwaZQcAAHg0yg4AAPBolB0AAODRKDsAAMCjUXYAAIBHo+wAAACPRtkBAAAejbIDAAA8GmUHAAB4NMoOAADwaJQdAADg0Sg7AADAo1F2AACAR6PsAAAAj0bZAQAAHo2yAwAAPBplBwAAeDTKDgAA8GiUHQAA4NEoOwAAwKNRdgAAgEej7AAAAI/m1rKzfft29enTR1FRUbIsSytXrrRbPmLECFmWZfe49dZb7dbJycnR448/rtDQUFWrVk19+/bVzz//XI7vAgAAVGRuLTtZWVlq3ry5Zs+eXeQ6d9xxh9LS0myPtWvX2i0fPXq0VqxYoaVLl+qzzz5TZmamevfurby8PFfHBwAAlYCPO188Pj5e8fHxxa7j5+eniIiIQpedO3dO8+bN09tvv62uXbtKkpYsWaLo6Ght2rRJPXr0cHpmAABQubi17JTE1q1bFRYWpuDgYHXs2FGTJ09WWFiYJCk5OVm5ubnq3r27bf2oqCg1adJEO3bsKLLs5OTkKCcnxzadkZEhScrNzVVubq4L3w2Aio7PAKDyKOnva4UuO/Hx8Ro0aJBiYmKUkpKiiRMnqnPnzkpOTpafn5/S09NVpUoVhYSE2D0vPDxc6enpRY47depUJSUlFZi/YcMGBQQEOP19AHAF13x8/XZXOYCKKzs7u0TrlenT4sKFCwVaVVBQUFmGtHP33Xfbvm7SpInatGmjmJgYrVmzRgMGDCjyecYYWZZV5PLx48dr7NixtumMjAxFR0ere/fuTs0PwHWe/GKDS8bt2bOnS8YF4HxX98xcj8NlJysrS88++6zef/99nTp1qsByVx4YHBkZqZiYGB08eFCSFBERoUuXLunMmTN2W3dOnDih9u3bFzmOn5+f/Pz8Csz39fWVr6+v84MDqDT4DAAqj5L+vpbobKxWrVrpzJkzkqRnn31Wmzdv1j/+8Q/5+fnpX//6l5KSkhQVFaXFixeXPnEJnDp1SqmpqYqMjJQktW7dWr6+vtq4caNtnbS0NO3fv7/YsgMAAH4/SrRlp1+/frYtIatWrdKiRYsUFxenkSNH6rbbblODBg0UExOjd955R/fee2+JXzwzM1OHDh2yTaekpGj37t2qWbOmatasqcTERA0cOFCRkZE6cuSInn/+eYWGhurOO++UJNWoUUOjRo3SU089pVq1aqlmzZp6+umn1bRpU9vZWQAA4PetRGXnL3/5i/z9/SVd2bpSv359SVeOzzl9+rQk6c9//rMeeeQRh158165diouLs01fPY5m+PDhmjNnjvbt26fFixfr7NmzioyMVFxcnJYtW6bq1avbnjNjxgz5+Pho8ODBunDhgrp06aKFCxfK29vboSwAAMAzlajsxMbGKi0tTWFhYapXr56OHj2qOnXqqHHjxnr//fd1yy23aPXq1QoODnboxTt16iRjTJHL169ff90xqlatqlmzZmnWrFkOvTYAAPh9KNExO19//bVCQ0MlSffff7927dol6cpZTVeP3RkzZoyeeeYZ1yUFAAAohRJt2WnevLnt63Hjxtm+jouL0/fff69du3apfv36dusBqDzqPrfGJeMemdbLJeMCgCMcujdWbm6u4uLi9OOPP9rm1alTRwMGDKDoAACACsmhsuPr66v9+/cXe8E+AACAisThu54PGzZM8+bNc0UWAAAAp3P4CsqXLl3Sv/71L23cuFFt2rRRtWrV7JZPnz7daeEAAADKyuGys3//frVq1UqS7I7dkcTuLQAAUOE4XHa2bNniihwAAAAu4fAxOwAAAJWJw1t2JOmr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448rNDRU1apVU9++ffXzzz87+rYAAICHcrjs3H777Vq8eLFt2rIs5efn67XXXlNcXJxDY2VlZal58+aaPXt2octfffVVTZ8+XbNnz9ZXX32liIgIdevWTefPn7etM3r0aK1YsUJLly7VZ599pszMTPXu3Vt5eXmOvjUAAOCBHN6N9dprr6lTp07atWuXLl26pHHjxunAgQM6ffq0Pv/8c4fGio+PV3x8fKHLjDF6/fXX9cILL2jAgAGSpEWLFik8PFzvvvuuHnroIZ07d07z5s3T22+/ra5du0qSlixZoujoaG3atEk9evRw9O0BAAAP43DZady4sfbu3as5c+bI29tbWVlZGjBggB599FFFRkY6LVhKSorS09PVvXt32zw/Pz917NhRO3bs0EMPPaTk5GTl5ubarRMVFaUmTZpox44dRZadnJwc5eTk2KYzMjIkSbm5ucrNzXXaewB+7yrj7xOZy0dlzIyKp6Q/Rw6XHUmKiIhQUlJSaZ5aYunp6ZKk8PBwu/nh4eG2A6HT09NVpUoVhYSEFFjn6vMLM3Xq1ELzb9iwodDjkQDPV6qPgutau3atS8a9gsxXkRm/V9nZ2SVar0Q/xXv37lWTJk3k5eWlvXv3FrtuYGCgoqOjC9wzq7R+ewsKY8x1b0txvXXGjx+vsWPH2qYzMjIUHR2t7t27KygoqGyBgUroyS82uGTcnj17umRciczXIjN+r67umbmeEpWdFi1aKD09XWFhYWrRooUsyyr2isk1atTQP//5T919990lS1uIiIgISVe23ly7e+zEiRO2rT0RERG6dOmSzpw5Y7d158SJE2rfvn2RY/v5+RV65pivr6/TShrKru5za1w29pFpvVw2Nv5PZfx9InP5qIyZUfGU9OeoRGdjpaSkqHbt2ravf/rpJ6WkpBT6+P777/X000/r2WefLX16SbGxsYqIiNDGjRtt8y5duqRt27bZikzr1q3l6+trt05aWpr2799fbNkBAAC/HyXashMTE1Po10X529/+puTk5Ouul5mZqUOHDtmmU1JStHv3btWsWVN16tTR6NGjNWXKFN1444268cYbNWXKFAUEBGjo0KGSrmxBGjVqlJ566inVqlVLNWvW1NNPP62mTZvazs4CAAC/b6U68uzs2bOaN2+evvvuO1mWpUaNGmnUqFGqUaOGJCkkJETLly+/7ji7du2y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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame(heitot)\n", "df['sum'] = df.sum(axis=1)\n", "\n", "ax = df['sum'].value_counts().sort_index().plot.bar()\n", "ax.set_xlabel('Silmälukujen summa')\n", "ax.set_ylabel('Esiintymiskertojen lukumäärä')\n", "ax.grid(axis = 'y')\n", "ax.set_axisbelow(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lisätietoa satunnaislukujen tuottamisesta: https://numpy.org/doc/stable/reference/random/index.html" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13.2" } }, "nbformat": 4, "nbformat_minor": 4 }