Tracks
/
Julia
Julia
/
Übungen
/
Problematische Wahrscheinlichkeiten
Problematische Wahrscheinlichkeiten

Problematische Wahrscheinlichkeiten

Lernübung

Einführung

Rational numbers sind Brüche mit einer Ganzzahl als Zähler, geteilt durch eine Ganzzahl als Nenner.

Zum Beispiel können wir 2//3 als exakten Bruch speichern, anstatt als den ungefähren Float64-Wert 0.6666...

Der Vorteil ist, dass (außer im Extremfall des Ganzzahlüberlaufs) eine rationale Zahl exakt bleibt. So vermeidest du die Rundungsfehler, die bei Gleitkommazahlen oft unvermeidlich sind.

Rationale Zahlen sind ein recht einfacher numerischer Typ und funktionieren weitgehend so, wie du es erwartest. Da sie in Julia seit den frühen Versionen ein Standardtyp sind, akzeptieren die meisten Funktionen sie als Eingabewert, genauso wie Ganzzahlen und Gleitkommazahlen.

Rationale Zahlen erstellen

Das Erstellen ist so einfach wie die Verwendung von // zwischen zwei Ganzzahlen.

julia> 3//4
3//4

julia> a = 3; b = 4;

julia> a//b
3//4

Gemeinsame Faktoren werden automatisch entfernt, wodurch der Bruch auf seine „gekürzte Form" reduziert wird: die kleinsten Ganzzahlen, die den Bruch genau darstellen, und mit einem nicht-negativen Nenner.

julia> 5//15
1//3

julia> 5//-15
-1//3

Rechnen mit rationalen Zahlen

Die üblichen arithmetic operators + - * / ^ % funktionieren mit rationalen Zahlen, im Wesentlichen genauso wie mit anderen numerischen Typen.

Ganzzahlen und andere Rationals kannst du einbeziehen, und du erhältst ein Rational-Ergebnis. Beziehst du einen float in den Ausdruck ein, ist die Ausgabe ein float, was einen (möglichen) Verlust an Genauigkeit zur Folge hat.

Wenn du einen float möchtest, verwende einfach die Funktion float(), um eine rationale Zahl umzuwandeln. Es ist ganz normal, rationale Zahlen zu verwenden, um die Genauigkeit über eine lange Berechnung hinweg zu bewahren, und am Ende in eine Gleitkommazahl umzuwandeln.

julia> 3//4 + 1//3  # addition
13//12

julia> 3//4 * 1//3  # multiplication
1//4

julia> 3//4 / 1//3  # division
9//4

julia> 3//4 ^ 2  # exponentiation
3//16

julia> 3//4 + 5  # rational and int => rational
23//4

julia> 3//4 + 5.3  # rational and float => float
6.05

julia> float(3//4)  # casting
0.75

Weitere Operationen

In Julia sind rationale Zahlen einfach Zahlen. Der Compiler wandelt Typen in der Regel nach Bedarf um.

Sei jedoch vorsichtig: Vergleiche funktionieren für Brüche mit einer endlichen Dezimaldarstellung:

julia> 3//4 == 0.75
true

julia> 3//4 < 0.74
false

Andernfalls sollte ein Rational für Vergleiche in einen Float umgewandelt werden:

julia> 1//3 == 1/3
false

julia> float(1//3) == 1/3
true

Mathematische Funktionen nehmen rationale Zahlen als Eingabewert, liefern aber möglicherweise ein Gleitkommaergebnis:

julia> sqrt(9//16)
0.75

Anleitung

Eine Forschungseinrichtung hat bemerkt, dass einige ihrer jungen Forschenden bei ihren Analysen mit wenig optimalen Methoden gearbeitet haben. Eine dieser Methoden besteht darin, diskrete Wahrscheinlichkeiten sofort in Gleitkommazahlen (also reelle Zahlen) umzuwandeln, bevor weitere Berechnungen durchgeführt werden.

Die erfahrenen Forschenden ziehen es vor, mit rationalen Zahlen zu rechnen, weil das eine höhere Genauigkeit liefern kann. Sie möchten wissen, ob die schlechten Praktiken der jungen Forschenden die Ergebnisse der Studien beeinflusst haben.

Es wurden zwei Arten von Studien durchgeführt:

  • Es wurden viele Tests durchgeführt, von denen jeder eine diskrete Wahrscheinlichkeit für einen Erfolg lieferte, und anschließend wurde der Mittelwert dieser Wahrscheinlichkeiten berechnet.
  • Es wurden viele unabhängige Ereignisse getestet, und die Gesamtwahrscheinlichkeit, dass alle Ereignisse eintreten, wurde durch Multiplikation berechnet.

Die erfahrenen Forschenden bitten dich, Funktionen zu schreiben, mit denen sie feststellen können, ob die Verwendung von Gleitkommazahlen zu Rundungsfehlern in den Analysen geführt hat. Außerdem sollst du für das Ergebnis eine genaue rationale Zahl angeben, wenn es Fehler gibt.

1. Gib das Verhältnis von Erfolgen zu Versuchen an

Die Funktion rationalize(successes, trials) nimmt zwei Arrays, successes und trials. Für einen Index i entspricht successes[i] der Anzahl der Erfolge, die bei trials[i] Versuchen aufgetreten sind. Die Funktion gibt ein Array rationaler Zahlen zurück, nämlich die Erfolge geteilt durch die Anzahl der Versuche, in derselben Reihenfolge wie die Eingabe-Arrays.

julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
 1//4
 2//5
 1//2

2. Finde die reellen Wahrscheinlichkeiten für Erfolge und Versuche

Ebenso nimmt die Funktion probabilities(successes, trials) zwei Arrays, successes und trials. Sie gibt ein Array von Gleitkommazahlen zurück, nämlich die Erfolge geteilt durch die Anzahl der Versuche, in derselben Reihenfolge wie die Eingabe-Arrays.

julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
 0.25
 0.4
 0.5

3. Prüfe den Mittelwert der Wahrscheinlichkeiten

Die Funktion checkmean(successes, trials) nimmt die beiden Arrays successes und trials. Sie vergleicht den Mittelwert der reellen Wahrscheinlichkeiten mit dem Mittelwert der rationalen Wahrscheinlichkeiten.

  • Sind die beiden Wahrscheinlichkeiten gleich, gibt checkmean true zurück.
  • Unterscheiden sich die beiden Wahrscheinlichkeiten, gibt checkmean die rationale Wahrscheinlichkeit zurück.
julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true

julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750

4. Prüfe die unabhängige Wahrscheinlichkeit

Die Funktion checkprob(successes, trials) nimmt die beiden Arrays successes und trials. Sie vergleicht die Gesamtwahrscheinlichkeit aus den Gleitkommawahrscheinlichkeiten mit der Gesamtwahrscheinlichkeit aus den rationalen Wahrscheinlichkeiten.

  • Sind die beiden Wahrscheinlichkeiten gleich, gibt checkprob true zurück.
  • Unterscheiden sich die beiden Wahrscheinlichkeiten, gibt checkprob die rationale Wahrscheinlichkeit zurück.
julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true

julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Julia Exercism

Bereit, mit Problematische Wahrscheinlichkeiten zu starten?

Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.