Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
| lehrkraefte:blc:informatik:ffprg1-2020:zufallszahlen [2021/04/09 14:47] – Ivo Blöchliger | lehrkraefte:blc:informatik:ffprg1-2020:zufallszahlen [2022/05/12 11:34] (current) – [Zufallszahlen] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== 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). | ||
| + | |||
| + | |||
| + | <code python zufall.py> | ||
| + | import random | ||
| + | |||
| + | print(" | ||
| + | for i in range(10): | ||
| + | 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:// | ||
| + | |||
| + | ===== 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(" | ||
| + | </ | ||
| + | </ | ||