sq_01_python_intro/jupyter_book/07_zufallszahlen.ipynb

314 lines
7.3 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "471b22f4-5b9d-423d-bf7d-6cef078b175e",
"metadata": {},
"source": [
"# Simulationen\n",
"\n",
"Aufbauend auf der letzten Aufgabe möchten wir jetzt simulieren, welches Ertrag wir erwarten können, wenn der Zinnsatz zufällig schwankt. Dafür benötigen wir eine Möglichkeit, diesen Zufall zu berechnen."
]
},
{
"cell_type": "markdown",
"id": "b298aa38-556e-43d4-aee1-0047477a53fa",
"metadata": {},
"source": [
"## Zufallszahlen\n",
"\n",
"Das Package `random` enthält Funktionen zu Erzeugung von Zufallszahlen.\n",
"Probieren wir es aus:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "2f9a1ee9-0a3f-4ee0-a6e1-d6bc61291889",
"metadata": {},
"outputs": [],
"source": [
"import random"
]
},
{
"cell_type": "markdown",
"id": "327159f5-1e19-4334-9738-e9cc8a0c9d47",
"metadata": {},
"source": [
"`help(random)` liefert eine lange Dokumentation. Wir brauchen nur einen kleinen Teil davon."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7ba2a1a0-745d-4c9b-bbdf-8e562a445204",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.27\n",
"0.57\n",
"0.12\n",
"3.79\n",
"1.4\n",
"1.25\n",
"1.14\n",
"0.71\n",
"3.77\n",
"0.52\n"
]
}
],
"source": [
"# Initialisierung - gleicher seed liefert gleiche Zufallszahlen!\n",
"random.seed(42)\n",
"samples = 10\n",
"for i in range(samples):\n",
" tmp = random.randint(0, 400)\n",
" print(tmp / 100)"
]
},
{
"cell_type": "markdown",
"id": "b8a2a8fe-fbb4-4ab7-b927-841d949f3cf6",
"metadata": {},
"source": [
"## Aufgabe\n",
"Was tut das kleine Beispiel?\n",
"Baue eine Funktion, die einen Array der Länge **n** zurückliefert.\n",
"Der Inhalt sollen Zufallszahlen mit 2 Nachkommastellen sein die zwischen **from** und **to* liegen."
]
},
{
"cell_type": "markdown",
"id": "7ed88639-c037-415a-b93f-bcdc8cb49a7c",
"metadata": {},
"source": [
"## Lösung"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "3ffef006-eac3-41f6-9334-f22db10dc0d0",
"metadata": {},
"outputs": [],
"source": [
"def rand_numbers(n, start, end):\n",
" digits = 2; # falls es mal nur 1 oder 3 Nachkommastellen werden sollen\n",
" factor = 10 ** digits;\n",
" result = []\n",
" for i in range(n):\n",
" result.append(random.randint(start * factor, end * factor) / factor)\n",
" \n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "34cda81b-7611-439e-8ba2-3f01c210fa76",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[9.12, 36.56, 4.6, 4.44, 9.67]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rand_numbers(5, 2, 44)"
]
},
{
"cell_type": "markdown",
"id": "976b757c-09fa-4492-8996-8129049dc0bf",
"metadata": {},
"source": [
"## Aufgabe\n",
"\n",
"Schreibe eine neue Funktion, die diese Funktion als Zinsen in der Funktion zur variablen Zinsberechnung verwendet."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "cf269399-9603-4fc6-ae16-c40562d4d8dc",
"metadata": {
"tags": [
"hide-input"
]
},
"outputs": [],
"source": [
"def variabler_zins(anlagebetrag, zinsen):\n",
" jahre = len(zinsen)\n",
" result = [anlagebetrag]\n",
" for i in range(0, jahre):\n",
" result.append(result[i] * (1+ zinsen[i]/100))\n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "16d443c6-6b7c-4362-9048-92f23f44da3a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[100, 101.49999999999999, 104.03749999999998, 107.67881249999998]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"variabler_zins(100, [1.5, 2.5, 3.5])"
]
},
{
"cell_type": "markdown",
"id": "ebbfb7e2-f7e1-4c1d-9f2e-6b5ad896be11",
"metadata": {},
"source": [
"## Lösung"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "ac0de40d-c851-40e8-9f18-2c68c25cd7f0",
"metadata": {},
"outputs": [],
"source": [
"def variabler_zufallszins(anlagebetrag, jahre, min_zins, max_zins):\n",
" return variabler_zins(anlagebetrag, rand_numbers(jahre, min_zins, max_zins))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "5d41f256-22ff-4604-9680-011cfbe77511",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1000,\n",
" 1005.5000000000001,\n",
" 1011.4324500000001,\n",
" 1024.479928605,\n",
" 1040.256919505517,\n",
" 1040.8810736572204]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"variabler_zufallszins(1000, 5, 0, 2)"
]
},
{
"cell_type": "markdown",
"id": "5af14f52-76be-448b-b15f-2fe0d7d50a13",
"metadata": {},
"source": [
"## Aufgabe\n",
"Eine einzelne Simulation hat nicht viel Aussagekraft. Schreibe eine Funktion, die die Simulation **n** mal ausführt und von jeder Ausführung das Endergebnis zurückgibt."
]
},
{
"cell_type": "markdown",
"id": "b4192e1f-8e0d-4de8-b6fb-215849aeb02f",
"metadata": {},
"source": [
"## Lösung"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "e5ef01b5-bdce-4a3e-8d29-a3081126bdab",
"metadata": {},
"outputs": [],
"source": [
"def simulate(anlagebetrag, jahre, min_zins, max_zins, n):\n",
" result = []\n",
" for i in range(n):\n",
" tmp = variabler_zufallszins(anlagebetrag, jahre, min_zins, max_zins)\n",
" result.append(tmp[-1]) # letztes Element in Array hat Index -1, vorletztes -2, usw.\n",
" \n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "441e6fc3-66e5-41bf-9bb2-c01c475ad0b8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1052.6442959071103,\n",
" 1064.427091942078,\n",
" 1083.9725955171834,\n",
" 1089.3384949096728,\n",
" 1093.7917438123886,\n",
" 1099.7624262587865,\n",
" 1112.5348861022283,\n",
" 1123.567897245912,\n",
" 1128.9355107957267,\n",
" 1167.8728995649053]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = simulate(1000, 5, 0, 4, 10)\n",
"results.sort()\n",
"results"
]
}
],
"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.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}