Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
lehrkraefte:blc:informatik:ffprg1-2020:zufallszahlen [2020/02/03 19:52] Ivo Blöchliger created |
lehrkraefte:blc:informatik:ffprg1-2020:zufallszahlen [2022/05/12 13:34] (current) Ivo Blöchliger [Zufallszahlen] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Zufallszahlen ====== | ====== Zufallszahlen ====== | ||
- | Für Spiele und Simulationen sind Zufallszahlen äusserst nützlich. Auch für kryptographische Anwendungen werden Zufallszahlen gebraucht. Dafür sind die Zufallszahlen von Python aber **nicht geeignet**. Und sowieso: Programmieren Sie nie selbst Krypto (es sei denn, sie machen seit 10 Jahren nichts anderes, als Kryptographie und Computerinnereien zu studieren). | + | Für Spiele und Simulationen sind Zufallszahlen äusserst nützlich. Auch für kryptographische Anwendungen werden Zufallszahlen gebraucht. Dafür sind die Zufallszahlen von Python aber **nicht geeignet**. Und sowieso: Programmieren Sie nie selbst Krypto (es sei denn, Sie machen seit 10 Jahren nichts anderes, als Kryptographie und Computerinnereien zu studieren). |
- | ===== Ganzzahlen, uniform verteilt ===== | ||
<code python zufall.py> | <code python zufall.py> | ||
- | from random | + | import random |
+ | |||
+ | print(" | ||
for i in range(10): | for i in range(10): | ||
- | print(random. | + | print(random.random()) |
+ | |||
+ | # Ich bevorzuge random.randrange weil es gleich wie range funktioniert | ||
+ | print(" | ||
+ | for i in range(10): | ||
+ | print(random.randrange(4)) | ||
+ | |||
+ | # Ich rate von random.randint ab und empfehle random.randrange | ||
+ | print(" | ||
+ | for i in range(10): | ||
+ | print(random.randint(1, | ||
</ | </ | ||
+ | '' | ||
+ | |||
Detaillierte Übersicht: https:// | Detaillierte Übersicht: https:// | ||
+ | |||
+ | ===== Aufgaben ===== | ||
+ | * Generieren Sie 10 Zufallszahlen (floats) zwischen 10.0 (inklusive) und 20.0 (exklusive). | ||
+ | * Welchen Wert erhält man im Durchschnitt, | ||
+ | * **Challenge**: | ||
+ | * Generieren Sie $n=10000$ mal einen zufälligen Punkt im Einheitsquadrat $[0,1] \times [0,1]$. Wie viele davon liegen im Einheitskreis (d.h. im Kreis mit Radius 1 um den Ursprung)? Wie viele müssten es sein? Berechnen Sie daraus eine Schätzung für $\pi$. | ||
+ | |||
+ | <hidden Lösungsvorschläge> | ||
+ | <code python float10bis20.py> | ||
+ | import random | ||
+ | |||
+ | print(" | ||
+ | for i in range(10): | ||
+ | print(random.random()*10+10) | ||
+ | </ | ||
+ | |||
+ | |||
+ | Simulation Maximum zweier Würfel: | ||
+ | <code python maxwurf2.py> | ||
+ | import random | ||
+ | n=100000 | ||
+ | s = 0 | ||
+ | for i in range(n): | ||
+ | w1 = random.randint(1, | ||
+ | w2 = random.randint(1, | ||
+ | if w1>w2: | ||
+ | s+=w1 | ||
+ | else: | ||
+ | s+=w2 | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Oder noch eine kompaktere Variante mit Arrays: | ||
+ | <code python maxwurfarray.py> | ||
+ | import random | ||
+ | n=100000 | ||
+ | numWurfel=2 | ||
+ | s = 0 | ||
+ | for i in range(n): | ||
+ | s += max([random.randint(1, | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Und exakt (durch Aufzählen aller Möglichkeiten) | ||
+ | <code python maxwurf2exakt.py> | ||
+ | n = 0 | ||
+ | s = 0 | ||
+ | for w1 in range(1,7): | ||
+ | for w2 in range(1,7): | ||
+ | s+=max(w1, | ||
+ | n+=1 | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Allgemein exakt. Um die Mathematik zu verstehen, denken Sie sich für n=2 Würfel ein 6x6 Raster und markieren Sie jene Felder, die zu einem gegebenen Maximum $m$ führen. Deren Anzahl kann als Differenz zweier Quadrate (bzw. Hyperwürfel für $n>2$) berechnet werden. | ||
+ | <code python maxwurfexakt.py> | ||
+ | numWurf = 2 | ||
+ | n = 6**numWurf | ||
+ | s = 0 | ||
+ | for w in range(1,7): | ||
+ | s+=w*(w**numWurf-(w-1)**numWurf) | ||
+ | |||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | <code python kreisimquadrat.py> | ||
+ | import random | ||
+ | n = 1000000 | ||
+ | s = 0 | ||
+ | for i in range(n): | ||
+ | r = random.random()**2+random.random()**2 | ||
+ | if (r<=1): | ||
+ | s+=1 | ||
+ | | ||
+ | print(" | ||
+ | </ | ||
+ | </ | ||
+ |