Commit 15cc2827 authored by Dominikus Herzberg's avatar Dominikus Herzberg

Outtake zu Multiple Choice entsteht

parent f88c53f8
......@@ -128,4 +128,73 @@ Nein, nein, so leicht sollten Sie es sich nicht machen. Entweder Sie haben Glüc
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[]
\ No newline at end of file
include::postDetails.adoc[]
== Zufällig ausgefüllter Multiple-Choice-Test
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.
.Was sind Multiple-Choice-Fragen?
****
Im Deutschen ist mit Multiple-Choice-Test schlicht ein Antwort-Wahl-Verfahren gemeint, d.h. zu einer Frage stehen mehrere Antworten zur Wahl. Offen dabei ist, wieviele Antworten richtig sein können. Verwendet man im Englischen den Begriff _Multiple Choice_, dann will man damit ausdrücken, dass genau _eine_ Antwort richtig ist, was man im Deutschen wiederum _Single Choice_ nennt. Verwirrend, nicht wahr?
****
Schreiben Sie zur Beantwortung der folgenden Fragen ein Programm, mit dem Sie die verschiedene Fälle simulieren können.
=== Reine Zufallskreuze
Angenommen, Sie sind unglücklicherweise nicht auf den Test vorbereitet. Wie viele Punkte erhalten Sie im Schnitt, wenn Sie zufällig Kreuze setzen?
=== Zufallskreuze schlau gemacht
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.
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?
=== Zufallskreuze mit Vorwissen
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?
=== Das Simulationsprogramm
Ihr Programm mag vollkommen anders aussehen. Hier ist ein Vorschlag, wie man ohne allzuviel Wissen um Wahrscheinlichkeiten zu einer Antwort kommen kann.
include::preDetailsSolution.adoc[]
Der folgende Programmcode simuliert eine Wahlstrategie für _eine_ Multiple-Choice-Aufgabe:
* Eine Multiple-Choice-Aufgabe `MC` hat eine festgelegte Anzahl von Antworten zu einer Frage; wir nennen die Anzahl `answers`, mindestens eine Antwort muss gegeben sein (`answers >= 1`)
* Jede Frage hat eine bestimmte Anzahl an richtigen Antworten, `solutions`, wobei `solutions <= answers` sein muss
* Wenn der Antwortgeber rät, dann muss er sich entscheiden, wieviele Antworten er ankreuzt; wir geben vor, dass er eine zufällige Anzahl ankreuzt uns zwar aus dem Wertebereich von `minGuesses` bis `maxGuesses`
[source,java]
----
include::{sourcedir}/multipleChoice.java[tag=KlasseKonstruktor]
----
Das Array `crosses` dient zur Simulation eines zufälligen Ankreuzverhaltens. Das Array wird initialisiert und kann mit einem Aufruf von `shuffle`, als Klassenmethode angelegt, zufällig durchmischt werden.
[source,java]
----
include::{sourcedir}/multipleChoice.java[tag=shuffle]
----
Die Simulation eines Lösungsdurchlaufs nimmt die Methode `simulate` vor.
* Per Zufall wird ausgelost, wieviele Antwortkreuze gemacht werden sollen.
* Stimmt die Anzahl der Antwortkreuze mit der Anzahl der Lösungen nicht überein, ist klar, dass die Antwort falsch ist; ein `false` wird zurückgemeldet.
* Stimmt die Anzahl der Antwortkreuze, wird eine zufällige Ankreuzlösung generiert.
* Es wird abgeglichen, ob die Antwortkreuze auch die Lösungen abdecken; entsprechen wird ein `false` bzw. ein `true` zurückgegeben
[source,java]
----
include::{sourcedir}/multipleChoice.java[tag=simulate]
----
Die Methode `run` führt eine Simulation mehrfach durch und gibt den prozentualen Anteil erfolgreicher Lösungen an.
[source,java]
----
include::{sourcedir}/multipleChoice.java[tag=run]
----
include::postDetails.adoc[]
import java.util.Random;
// tag::KlasseKonstruktor[]
class MC {
int answers, solutions;
int minGuesses, maxGuesses;
int[] crosses;
MC(int answers, int solutions, int minGuesses, int maxGuesses) {
assert answers >= 1 && solutions <= answers;
assert minGuesses >= 0 && minGuesses <= maxGuesses && maxGuesses <= answers;
this.answers = answers;
this.solutions = solutions;
this.minGuesses = minGuesses;
this.maxGuesses = maxGuesses;
crosses = new int[answers];
for(int i = 1; i <= answers; i++) crosses[i-1] = i;
}
// end::KlasseKonstruktor[]
// tag::simulate[]
boolean simulate() {
Random random = new Random();
int guesses = minGuesses + random.nextInt(maxGuesses - minGuesses + 1);
if (guesses != solutions) return false;
MC.shuffle(crosses);
for(int i = 1; i <= guesses; i++) {
if (crosses[i-1] > solutions) return false;
}
return true;
}
// end::simulate[]
// tag::run[]
double run(long samples) {
long count = 0;
for(long i = 1; i <= samples; i++) {
count += simulate() ? 1 : 0;
}
return (double) count / (double) samples;
}
// end::run[]
// tag::shuffle[]
static void shuffle(int[] a) {
Random random = new Random();
for(int i = 0; i < a.length; i++) {
int j = random.nextInt(a.length);
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
// end::shuffle[]
// tag::KlasseKonstruktor[]
}
// end::KlasseKonstruktor[]
double tolerance = 0.01;
long runs = 1_000_000;
Math.abs(new MC(4,1,1,1).run(runs)-0.25) <= tolerance;
\ 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