![]() |
![]() |
C++ |
G.Eichelsdörfer - Staatliche Technikerschule Weilburg |
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.
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ß.
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 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."
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.