zurück weiter

C++

G.Eichelsdörfer - Staatliche Technikerschule Weilburg

Kleines Projekt 1: Zahlenratespiel (2)

Was haben wir bisher?

srand(time(NULL)); // Anfangsbitmuster zeitabhängig setzen
cout << rand() << endl; // Zufallszahl holen und ausgeben lassen

Wenn Sie diese beiden Anweisungen in die main-Funktion schreiben, wird mit hoher Wahrscheinlichkeit bei jedem Aufruf des Programms eine andere Zahl ausgegeben.

Welche Werte können diese Zufallszahlen besitzen?

Zitat aus der Online-Hilfe:
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX.

"Aha!", so werden Sie vermutlich denken "Ich brauche also nur RAND_MAX auf einen anderen Wert wie 100 zu setzen, und schon erhalte ich Zufallszahlen von 0 bis 100." Also RAND_MAX = 100;
Sie mögen das versuchen und dabei feststellen, dass der Compiler eine Zuweisung an RAND_MAX nicht zulässt.
Fehlermeldung: Linker Operand muss ein L-Wert sein.
Ein L-Wert (englisch: L-value) ist etwas, dem man einen Wert zuweisen kann. Variable sind L-Werte, weil man einer Variablen etwas zuweisen kann. Das L kommt von left, ein L-Wert kann links vom Gleichheitszeichen stehen. RAND_MAX ist eine Konstante und Konstanten kann man keinen Wert zuweisen, sie sind keine L-Werte.

RAND_MAX besitzt in VC++ den Wert 32767. Also können wir Werte von 0 bis 32767 erhalten. Für unsere Zwecke ist dieser Zahlenbereich zu groß.

Wie kann man den Zahlenbereich für Zufallszahlen einschränken?

Was hier benötigt wird, ist eine Abbildung von einem größeren Intervall (Zahlenbereich) in ein kleineres Intervall.
[0,32767] --> [0,99]
[0,32767] ist das Intervall von 0 (einschließlich) bis 32767 (einschließlich), [0,99] entsprechend.

Nun könnten Sie versuchen eine bedingte Anweisung zu schreiben, etwa folgenden Inhalts:
Wenn die Zufallszahl größer als 99 ist, streiche die vordersten Stellen!
Abgesehen davon, dass diese Anweisung viel zu ungenau ist (Wie viele Stellen sind zu streichen?), gelingt das Streichen von Stellen allenfalls in einem String und ist aufwändiger als nötig. Lassen Sie also vom "Stellenstreichen" ab und folgen Sie mir in die Welt des Teilens (Dividierens)!

Frage: Welche Reste bleiben bei den folgenden Divisionen?
12536 : 1000  28135 : 1000  10001 : 1000  23 : 1000

Wenn man durch 1000 teilt, kann der Rest nur kleiner als 1000 sein, höchstens 999. Mister "Stellenstreichen" lässt grüßen.
Allgemein: Wenn man eine beliebige ganze Zahl durch n teilt, bleibt ein Rest von 0 bis n-1.
Beim Teilen durch 123 kann nur ein Rest von 0 bis 122 bleiben - und das ist besser als Stellen streichen.
Nun fehlt nur noch ein Operator, der uns den Rest beim Teilen liefert.

Der Modulus-Operator %

Der gesuchte Operator heißt Modulus-Operator. Der Rest beim Ganzzahlteilen nennt man auch das Modul.
12536 % 1000 ergibt den Wert 536, also den Rest. Man liest: "12536 modulo 1000 ist 536."


Auftrag

Erstellen Sie ein Programm, welches eine Zufallszahl liefert, die garantiert zwischen 1 und 3 liegt!
Arbeitsbereich wie oben, Projekt: eins_bis_drei

Hinweis: Lassen Sie zuerst Zufallszahlen von 0 bis 2 erzeugen!

Erweiterung:
Der Benutzer gibt sowohl den kleinsten als auch den größten Wert für die zu erzeugende Zufallszahl ein.