Commit a508fe0f authored by Dominikus Herzberg's avatar Dominikus Herzberg

Outtake zu Multiple-Choice fertig

parent a2d70b4e
......@@ -130,9 +130,9 @@ Wenn Sie den Fehler entdeckt haben, wie würden Sie ihn beheben?
// Nach der Umwandlung in eine Zahl könnte man überprüfen, ob sich der originale String aus der Zahl rekonstruieren lässt.
include::postDetails.adoc[]
== Zufällig ausgefüllter Multiple-Choice-Test
== Multiple-Choice-Test und der Zufall
Angenommen, Sie bekommen einen Multiple-Choice-Test mit zehn Fragen vorgelegt, wobei es zu jeder Frage vier ankreuzbare Antworten gibt. Sie wissen lediglich, dass pro Frage mehr als eine Antwort korrekt sein kann. Der Test wird so bewertet, dass es zur Lösung auf eine Frage nur dann einen Punkt gibt, wenn ausschließlich die korrekte Antwort bzw. die korrekten Antworten angekreuzt sind.
Angenommen, Sie bekommen einen Multiple-Choice-Test mit zehn Fragen vorgelegt, wobei es zu jeder Frage vier ankreuzbare Antworten gibt. Sie wissen lediglich, dass pro Frage mehr als eine Antwort korrekt sein kann. Der Test wird so bewertet, dass es zur Lösung auf eine Frage nur dann einen Punkt gibt, wenn ausschließlich die korrekte Antwort bzw. die korrekten Antworten angekreuzt sind.footnote:[Die Anregung für diese Aufgabe geht zurück auf eine Email, die ich von Philipp Sautner erhalten habe.]
.Was sind Multiple-Choice-Fragen?
****
......@@ -148,6 +148,8 @@ Angenommen, Sie sind unglücklicherweise nicht auf den Test vorbereitet. Wie vie
include::preDetailsSolution.adoc[]
Da Sie nicht wissen, ob ein, zwei, drei oder vier Kreuze richtig sind, müssen wir für jeden dieser mit einem Viertel gewichteten Fälle ausrechnen, was es bedeutet, ein, zwei, drei oder vier Kreuze zu setzen. Man kommt im Mittel auf 10.4%.
CAUTION: Das verwendete Simulationsprogramm wird weiter unten erklärt. Sie können anhand seiner Nutzung vermutlich erraten, was die einzelnen Aufruf-Parameter bedeuten.
----
jshell> new MC(4,1,1,4).run(1_000_000)
$35 ==> 0.062644
......@@ -165,6 +167,8 @@ jshell> ($35 + $36 + $37 + $38)/4
$39 ==> 0.10404450000000001
----
Lassen Sie uns noch ein paar weitere Fälle betrachten, um etwas über Multiple-Choice-Fragen zu lernen.
Schließt man aus, dass Fälle mit vier korrekten Antworten vorkommen, dann sinkt die Wahrscheinlichkeit eines Zufallstreffers ab auf 7.4%.
----
......@@ -200,26 +204,62 @@ Und geht man davon aus, dass nur eine Antwort korrekt ist, dann wählt man zu 25
jshell> new MC(4,1,1,1).run(1_000_000)
$47 ==> 0.249135
----
include::postDetails.adoc[]
=== Zufallskreuze schlau gemacht
Es scheint also sinnvoll zu sein, MC-Fragen zu stellen, für die man ein bis drei mögliche Antworten ankündigt. Das gilt aber nur, wenn man das statistisch gesehen auch durchzieht. Praktisch ist es nicht leicht, Fragen zu entwerfen, bei denen auch mal drei Antworten richtig sind, ohne dass die Antworten offensichtlich sind.
Ist es so schlau, rein zufällig Kreuze zu setzen? Sie lesen die Antworten zu den Fragen durch und stellen fest, dass sich manche Antworten ausschließen -- das kann man spachlogisch rausfinden, ohne etwas von der Thematik zu verstehen. Sie kommen zu dem Schluss, dass bei sieben der zehn Aufgaben nur eine oder zwei Antworten richtig sein können, und dass bei den restlichen drei Aufgaben ein, zwei oder drei Antworten richtig sein können.
Wie viele Punkte erhalten Sie im Schnitt, wenn Sie zwar zufällig Kreuze setzen, aber das abgeleitete Wissen um die Anzahl der möglichen Antworten ausnutzen?
include::preDetailsSolution.adoc[]
Wenn ein oder zwei Antworten richtig sind, dann "erraten" wir die richtige Antwort zu 10.4% -- das haben wir in der Lösung der vorigen Aufgabe gelernt. Bei ein bis drei richtigen Antworten ist die "Raterei" mit 7.4%iger Wahrscheinlichkeit erfolgreich -- auch das haben wir zuvor ermittelt. Da das eine in sieben, das andere in drei Fällen zutrifft, kommen wir auf eine Wahrscheinlichkeit von (7*10.4% + 3*7.4%)/10 = 9.5%.
include::postDetails.adoc[]
=== Zufallskreuze mit Vorwissen
=== Zufallskreuze schlau gemacht
Ihnen liegt die Musterlösung zu dem MC-Test vor. Sie wissen nun, wieviele Antworten tatsächlich richtig waren und was sich, mit Blick auf die sprachliche Analyse der Antworten, an Mutmaßungen über die Anzahl möglicher Lösungen aussagen lässt. Wir hoch waren die Chancen eines Studierenden nun tatsächlich, per Zufall Punkte zu holen?
Ist es so schlau, rein zufällig Kreuze zu setzen? Sie lesen die Antworten zu den Fragen durch und stellen fest, dass sich manche Antworten ausschließen -- das kann man rausfinden, ohne etwas von der Thematik zu verstehen. Sie kommen zu dem Schluss, dass bei sieben der zehn Aufgaben nur eine oder zwei Antworten richtig sein können, und dass bei den restlichen drei Aufgaben ein, zwei oder drei Antworten richtig sein können.
|===
| Frage | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. | 9. | 10.
Wie viele Punkte erhalten Sie im Schnitt, wenn Sie zwar zufällig Kreuze setzen, aber das abgeleitete Wissen um die Anzahl der möglichen Antworten ausnutzen?
| Lösung | 1 | 1 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 2
=== Zufallskreuze mit Vorwissen
| Vermutung | 1-3 | 1-2 | 1-2 | 1-3 | 1-2 | 1-2 | 1-2 | 1-2 | 1-3 | 1-2
|===
include::preDetailsSolution.adoc[]
Stellen wir die möglichen Lösungen in einer Übersicht zusammen:
* 5x `new MC(4,1,1,2)`
* 2x `new MC(4,1,1,3)`
* 2x `new MC(4,2,1-2)`
* 1x `new MC(4,2,1-3)`
Das Ergebnis liegt bei 10.1%.
Sie erfahren auf nicht ganz legalem Weg etwas über die Lösungen: bei 7 Aufgaben ist nur ein Kreuz zu setzen, bei drei Aufgaben zwei Kreuze. Wie viele Punkte können Sie mit diesem Wissen mit Hilfe des Zufalls erreichen?
----
jshell> new MC(4,1,1,2).run(1_000_000)
$49 ==> 0.124973
jshell> new MC(4,1,1,3).run(1_000_000)
$50 ==> 0.083046
jshell> new MC(4,2,1,2).run(1_000_000)
$51 ==> 0.083814
jshell> new MC(4,2,1,3).run(1_000_000)
$52 ==> 0.055843
jshell> (5*$49 + 2*$50 + 2*$51 + $52)/10
$53 ==> 0.10144280000000001
----
include::postDetails.adoc[]
=== Das Simulationsprogramm
Ihr Programm mag vollkommen anders aussehen. Hier ist ein Vorschlag, wie man ohne allzuviel Wissen um Wahrscheinlichkeiten zu einer Antwort kommen kann.
Ihr Programm mag vollkommen anders aussehen. Hier ist ein Vorschlag, wie man ohne allzuviel Wissen um Wahrscheinlichkeiten zu Antworten kommen kann.
include::preDetailsSolution.adoc[]
Der folgende Programmcode simuliert eine Wahlstrategie für _eine_ Multiple-Choice-Aufgabe:
......@@ -314,5 +354,10 @@ jshell> new MC(4,2,2,4).run(1_000_000)
$30 ==> 0.05588
----
Die besprochenen Fälle liegen allesamt als Testfälle vor. Es kann nicht ganz ausgeschlossen werden, dass ein Test zufällig außerhalb der Toleranzzone liegt, aber bislang hat sich eine Genauigkeit von einem halben Prozentpunkt als zuverlässig erwiesen.
[source,java]
----
include::{sourcedir}/multipleChoice.java[tag=Tests]
----
include::postDetails.adoc[]
......@@ -57,6 +57,18 @@ class MC {
}
// end::KlasseKonstruktor[]
double tolerance = 0.01;
// tag::Tests[]
double tolerance = 0.005;
long runs = 1_000_000;
Math.abs(new MC(4,1,1,1).run(runs)-0.25) <= tolerance;
\ No newline at end of file
assert Math.abs(new MC(4,1,1,1).run(runs)-1.0/4) <= tolerance : "Test 1";
assert Math.abs(new MC(4,1,1,2).run(runs)-1.0/4/2) <= tolerance : "Test 2";
assert Math.abs(new MC(4,1,1,3).run(runs)-1.0/4/3) <= tolerance : "Test 3";
assert Math.abs(new MC(4,1,1,4).run(runs)-1.0/4/4) <= tolerance : "Test 4";
assert Math.abs(new MC(4,3,3,3).run(runs)-1.0/4) <= tolerance : "Test 5";
assert Math.abs(new MC(4,2,2,2).run(runs)-1.0/6) <= tolerance : "Test 6";
assert Math.abs(new MC(4,2,1,2).run(runs)-1.0/6/2) <= tolerance : "Test 7";
assert Math.abs(new MC(4,2,1,3).run(runs)-1.0/6/3) <= tolerance : "Test 8";
assert Math.abs(new MC(4,2,1,4).run(runs)-1.0/6/4) <= tolerance : "Test 9";
assert Math.abs(new MC(4,2,2,3).run(runs)-1.0/6/2) <= tolerance : "Test 10";
assert Math.abs(new MC(4,2,2,4).run(runs)-1.0/6/3) <= tolerance : "Test 11";
// end::Tests[]
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment