C++ lernen mit "Einstieg in C++" von A. Willemer

  • Themenstarter Themenstarter t-bone-steak
  • Beginndatum Beginndatum
T

t-bone-steak

Hallo Zusammen!
Ich bin als absoluter Programmier-Anfänger gerade dabei mit Hilfe des o.g. Buches mir selbst ein paar Sachen beizubringen.
Ich habe mir zwar die kostenlose Version "Microsoft Visual C++ 2008 Express Edition" heruntergeladen, benutze aber zur Zeit das im Buch mitgelieferte (auf CD) Programm "Dev-C++". Der Grund besteht darin, dass ich mit den ganzen Anwendungstypen, die mir beim Anlegen eines neuen Projektes bei der "Microsoft Visual C++ 2008 Express Edition" angeboten werden, nichts anfangen kann.

Jetzt weiß ich nicht, ob mein Problem nur wegen Dev-C++ besteht oder ob das auch bei Visual C++ der Fall wäre:

Wenn ich ein - nach der Vorgabe des Buches - Progrämmchen erstellen will, das sich eine Zahl zwischen 1 und 1000 "ausdenkt" und ich diese erraten soll, muss ich den Befehl "rand()" verwenden. Bloß jedes Mal, wenn ich das Programm von Vorne starte, kann ich bereits die Lösung eintippen, da der Computer sich immer wieder die selbe Zahl aussucht.
Das Programm sieht so aus:

#include <iostream>
using namespace std;
#include <stdlib.h>

int main()
{
int Geraten;
int SuchZahl;
srand(4); // Hier müsste ich immer wieder die Zahl in der Klammer ändern, um andere gewollte "Zufallszahlen" zu bekommen! Das ist doch Schwachsinn!
SuchZahl = rand() % 1000 + 1;
do
{
cout << "Eine Zahl zwischen 1 und 1000!" << endl;
cin >> Geraten;
if (Geraten < SuchZahl)
{
cout << "zu klein!" << endl;
}
if (Geraten > SuchZahl)
{
cout << "zu gross!" << endl;
}
}
while (Geraten != SuchZahl);
cout << "Das war richtig!" << endl;
}

Wer kann mir sagen, was mein Fehler ist bzw. wie der Computer sich wirklich eine Zahl "ausdenkt"? Danke im Voraus!
 
Hi,

also kurz und knapp : Du musst als Parameter für srand() die Systemzeit übergeben, sonst
kommt natürlich immer wieder die selbe Zahl raus, da das "Zufallsprinzip" auf einem Algorithmus
basiert, der diesen Anhand des Startwerts ausrechnet. Echte Zufallszahlen sind mit einem PC nicht zu generieren,
da er nicht "zufällig denken" kann.
Dein Befehl sollte lauten srand((unsigned)time(NULL));

LG
 
Zuletzt bearbeitet:
Danke, das hat jetzt wunderbar funktioniert! Mich wundert es, dass das nicht in dem Buch angesprochen wurde.
Inwiefern hat die Systemzeit etwas mit dem random-Start zu tun? Misst der Computer den Zahlenbereich als Zeitbereich?
 
Also Folgendes:

Es gibt einige Verfahren zur Ermittlung einer relativ zufälligen Zahl...

Das Hewlett Packard- Verfahren beispielsweise geht folgendermaßen vor:

Als Startwert wird eine Zahl zwischen Null und Eins benötigt,
dann addiert man die Kreiszahl PI, potenziert dies mit 8 und mit dem Nachkommaanteil startet man den Algorithmus neu,
wenn man eine weitere zufällige Zahl benötigt.

Durch die Angabe von srand((unsigned)TIME(NULL)); übergibst du dem Algorithmus die Anzahl
der Millisekunden seit dem 1.1.1970... Da diese sich ständig ändert mit dem Voranschreiten der Zeit,
erhälst du so auch immer einen neuen zufälligen Wert :)
 
Zurück