MINT lernen

Übungen: Zahlenraten

Zufall, Schleife, Hinweise — hier prüfst du, ob dein Ratespiel fair würfelt und nicht ewig läuft.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Zehn Übungen zu Zufallszahlen, Spielschleifen und der Halbierungsstrategie — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.

A1
Bausteine eines Ratespiels
AFB I

Ordne jedem Code-Baustein seine Aufgabe im Zahlenraten zu.

Ansatz: Beginne mit den beiden #include-Zeilen: Welche Funktion steckt in welchem Header?
Weiter: Das „s“ in srand steht für seed, den Startwert.
A2
Stimmt’s? — Zufall in C++
AFB I

Nenne zu jeder Aussage, ob sie stimmt.

Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5

Die zweite Aussage ist der häufigste Anfängerfehler: srand in der Schleife macht den Zufall kaputt, weil time(0) sich nur einmal pro Sekunde ändert.
Ansatz: Rechne bei %-Aussagen mit dem kleinsten und größten möglichen Rest.
Weiter: time(0) liefert die Sekunden seit 1970 — innerhalb einer Sekunde immer dieselbe Zahl.
A3
Größte Würfelzahl?
AFB I Trick
C++ · wurf.cpp
int z = rand() % 6 + 1 * 2;

Mia will damit „einen Würfel verdoppeln“. Gib den größten Wert an, den z tatsächlich annehmen kann.

Überlege selbst und trage das Ergebnis ein — Enter prüft direkt.
Punkt vor Strich gilt auch für % und *: Gerechnet wird (rand() % 6) + (1 * 2), also 0 … 5 plus 2 = 2 … 7. Typischer Fehler: 12 — für den verdoppelten Würfel bräuchte Mia (rand() % 6 + 1) * 2.
Ansatz: Setze Klammern so, wie C++ rechnet: % und * binden stärker als +.
Weiter: rand() % 6 ist höchstens 5, 1 * 2 ist 2.
A4
Zufallszahlen aus einem Bereich
AFB II

Aus rand() % n (Werte 0 … n − 1) wird die Formel a + rand() % (b - a + 1) für Zahlen von a bis b. Leite die Werte Schritt für Schritt her.

Arbeite die Kette Schritt für Schritt ab: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Für Zahlen von 20 bis 50: \(n = b - a + 1\) =
  2. kleinster Wert von 20 + rand() % 31
  3. größter Wert von 20 + rand() % 31
  4. Für Zahlen von −5 bis 5: \(n\) =
Der Rest liegt zwischen 0 und n − 1; addiert man a, verschiebt sich der Bereich auf a … a + n − 1. Damit das b ist, muss n = b − a + 1 sein. Typischer Fehler: n = b − a (30 bzw. 10) — dann fehlt die obere Grenze. Für −5 … 5 lautet der Ausdruck -5 + rand() % 11.
Ansatz: Zähle die Zahlen im Bereich: Von 20 bis 50 sind es nicht 30.
Weiter: Kleinster Wert: Rest 0. Größter Wert: Rest n − 1.
A5
Eine Partie mitschreiben
AFB II
C++ · runde
do {
    cout << "Dein Tipp: ";
    cin >> tipp;
    versuche++;
    if (tipp < geheim) cout << "groesser" << endl;
    else if (tipp > geheim) cout << "kleiner" << endl;
    else cout << "Treffer" << endl;
} while (tipp != geheim);

Die Geheimzahl ist 71, versuche startet bei 0. Stelle die Partie in der Tabelle dar (Ausgabe als groesser, kleiner oder Treffer).

Fülle alle Felder aus und prüfe dann. Enter in einem Feld prüft ebenfalls.
TippAusgabeversuche
50
75
62
68
71
Die Ausgabe beschreibt die Geheimzahl, nicht den Tipp: Bei Tipp 50 ist die Zahl größer. Typischer Fehler: genau umgekehrt denken („50 ist kleiner“ → kleiner). Die Spielerin halbiert geschickt und trifft nach 5 Versuchen; versuche++ steht vor der Prüfung, deshalb zählt auch der Treffer mit.
Ansatz: Frage bei jedem Tipp: Ist die Geheimzahl 71 größer oder kleiner als der Tipp?
Weiter: Nach jedem Tipp wächst versuche um 1 — auch beim Treffer.
A6
Würfeln bis 20
AFB II

Ein Würfel wird so lange geworfen, bis die Augensumme mindestens 20 ist; dann wird die Zahl der Würfe ausgegeben. Ergänze die Lücken.

Wähle in jedem Menü den passenden Eintrag und prüfe dann alle auf einmal.
C++ · wuerfel.cpp
#include <iostream>
#include 
#include <ctime>
using namespace std;

int wuerfeln() {
    return ;
}

int main() {
    ;
    int summe = 0, wuerfe = 0;
    while () {
        summe = summe + wuerfeln();
        wuerfe++;
    }
    cout << "20 erreicht nach " << wuerfe << " Wuerfen" << endl;
    return 0;
}
rand() % 6 allein liefert 0 bis 5 — ein Würfel ohne Sechs, dafür mit Null. srand(0) startet immer gleich, jedes Spiel verliefe identisch. Typischer Fehler bei der Bedingung: summe == 20 — am Anfang ist die Summe 0, die Bedingung also falsch, und die Schleife läuft kein einziges Mal (Ausgabe „nach 0 Wuerfen“).
Ansatz: Die Schleife soll laufen, solange das Ziel noch nicht erreicht ist.
Weiter: Ein Würfel zeigt 1 bis 6: Rest 0 … 5, dann plus 1.
A7
Der Computer rät
AFB II Mix

Hier rät der Computer selbst — mit while und Ganzzahldivision aus 2.1.

C++ · halbieren.cpp
int unten = 1, oben = 100, versuche = 0, tipp = 0;
while (tipp != geheim) {
    tipp = (unten + oben) / 2;
    versuche++;
    if (tipp < geheim) unten = tipp + 1;
    else if (tipp > geheim) oben = tipp - 1;
}

Analysiere den Code für geheim = 83 und markiere alle zutreffenden Aussagen.

Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Die Tippfolge für 83: 50, 75, 88, 81, 84, 82, 83 — sieben Tipps. Auch für 100 sind es sieben (50, 75, 88, 94, 97, 99, 100). Bei geheim = 50 trifft schon der erste Tipp, die Schleife läuft also nur einmal. Typischer Fehler: (76 + 100) / 2 als 88,0 und (76 + 87) / 2 als 81,5 rechnen — Ganzzahldivision schneidet ab: 81.
Ansatz: Führe eine kleine Tabelle mit unten, oben und tipp.
Weiter: Tipp 1: (1 + 100) / 2 = 50. Da 50 < 83, wird unten = 51.
A8
Fehlersuche: Zahlenraten
AFB III

Gesucht ist eine Zahl von 1 bis 100; am Ende soll die Zahl der Versuche erscheinen. Überprüfe den Code — drei Zeilen sind fehlerhaft.

In diesem Code stecken Fehler. Klicke genau die fehlerhaften Zeilen an — die richtigen musst du stehen lassen.
Zeile 6 ist richtig: srand steht einmal vor der Schleife. Der Fehler in Zeile 15 ist der auffälligste — das Spiel endet nach dem ersten Fehlversuch. Die beiden anderen fallen beim Testen leicht durch: Die 100 fehlt nur selten, und ein uninitialisiertes versuche ist manchmal zufällig 0 (-Wall warnt aber).
Ansatz: Prüfe den Zahlenbereich, alle Startwerte und die Abbruchbedingung.
Weiter: Eine do-while-Bedingung sagt, wann weitergemacht wird.
A9
Wie viele Versuche braucht man?
AFB III

Beim Raten mit geschickter Halbierung braucht man für die Zahlen 1 bis 100 höchstens 7 Versuche. Schätze für andere Bereiche ab, wie viele Versuche man höchstens braucht.

Wähle für jede Zeile eine Stufe: 1 = höchstens 4, 2 = 5 oder 6, 3 = genau 7, 4 = 8 oder 9, 5 = 10 oder mehr. Mit der Tastatur: Tab zur Zeile, ←/→ zwischen den Stufen, Enter setzt.
1 = höchstens 45 = 10 oder mehr
Zahlen von 1 bis 10
Zahlen von 1 bis 60
Zahlen von 1 bis 100
Zahlen von 1 bis 300
Zahlen von 1 bis 1000
Jeder Versuch halbiert den Bereich ungefähr: Mit k Versuchen schafft man etwa \(2^k\) Zahlen. 10 ≤ 16 = 24, 60 ≤ 64 = 26, 300 ≤ 512 = 29, 1000 ≤ 1024 = 210. Typischer Fehler: linear denken — zehnmal so viele Zahlen (1 bis 1000) kosten nur 3 Versuche mehr, nicht zehnmal so viele.
Ansatz: Verdopple: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 — und zähle, wie oft.
Weiter: Suche die kleinste Zweierpotenz, die mindestens so groß ist wie der Bereich.
A10
Kopfrechen-Quiz
AFB III

Ein anderes Konsolenspiel: Drei Malaufgaben mit Zufallszahlen von 1 bis 10, am Ende die Zahl der richtigen Antworten. Der Zufallsgenerator wird ganz zu Beginn gestartet. Entwirf den Rumpf von main, indem du die Zeilen ordnest.

Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1srand(time(0));
2int richtig = 0, antwort;
3for (int i = 0; i < 3; i++) {
4 int a = rand() % 10 + 1, b = rand() % 10 + 1;
5 cout << a << " * " << b << " = ";
6 cin >> antwort;
7 if (antwort == a * b) richtig++;
8}
9cout << richtig << " von 3 richtig" << endl;
Die Zufallszahlen gehören in die Schleife — sonst käme dreimal dieselbe Aufgabe. srand dagegen gehört davor, sonst liefert es innerhalb einer Sekunde immer dieselben Zahlen. Die Ausgabe des Ergebnisses steht nach der Schleife, sonst erscheint sie nach jeder Aufgabe.
Ansatz: Überlege für jede Zeile: einmal (vor oder nach der Schleife) oder dreimal (in der Schleife)?
Weiter: In der Schleife: Zahlen ziehen, anzeigen, einlesen, prüfen.