Zufallsgenerator?!

Hallo ich habe folgendes Problem wenn ich dieses Spiel spielen möchte: Es ist Zahlenraten
Quellcode:
#include
#include
#include

using namespace std;

#pragma comment (lib, „winmm.lib“)

//Funktionsprototypen
//
int Spielen (int Level);
int WaehleLevel (int Level);
int TesteHighscore (int Punkte, int Highscore);
void ZeigeInfos ();

//Hauptprogramm
//
int main ()
{
//Variablen
//
char Auswahl;
int Level = 1;
int Highscore = 100;

//Verarbeitung des Menüs
//
do
{
//Menü ausgeben
//
cout > Auswahl;

//Je nach Eingabe verzweigen
switch (Auswahl)
{
//Neues Spiel starten
case (‚n‘):
case (‚N‘):
{
// Spielen
int Punkte;
Punkte = Spielen (Level);

Highscore = TesteHighscore (Punkte, Highscore);

} break;

//Level Wählen
case (‚l‘):
case (‚L‘):
{
Level = WaehleLevel (Level);

} break;

//Highscore anzeigen?
case (‚h‘):
case (‚H‘):
{
cout > NeuerLevel;

//Üngültiger Level
if (NeuerLevel 10)
{
//Fehler Meldung ausgeben
cout 10);

//Level zurück geben
return NeuerLevel;
}

//Spielen
//
int Spielen (int Level)
{
int ZufallsZahl;
int Geraternezahl = 0;
int Bereich = Level*10;
int Versuche = 0;
int Punkte = 0;

//Bereich ausgeben, in dem geraten wird
cout > Geraternezahl;

Versuche++;

//Zahl hat nicht gestimmt, also Hinweis
if (Geraternezahl ZufallsZahl)
cout Highscore)
{
cout

Hallo,

die „ZufallsZahl“ wird in deinem Programm ja gar nicht berechnet. Es ist einfach eine uninitialisierte Variable.

Zufallszahl berechnen:
„ZufallsZahl = (rand()%Bereich)+1;“

und in main() solltest Du noch den Zufallsgenerator initialisieren. Z.B. so:
srand(time(NULL));

Viel Glück
Dirk

Vielen Dank Dirk jetzt funkt alles so wie ich es will! :smile:

LG Tobi

Ich seh da keinen Zufallszahlengenerator, nur eine nicht initialisierte Variable. Da kann irgendwas drinstehen was vorher im Stack an der Speicherstelle stand.

Ich habe schon eine antwort bekommen die mein Problem gelöst hat aber danke dir

LG Tobias

Du setzt ZufallsZahl ja nicht.

Da steht nur
int Zufallszahl;

Was zwar rein theoretisch zwar zu einer Zufallszahl führt.

Dann ist der Wert immer das, was vorher im Speicher stand. Wenn an der Speicherstelle „zufällig“ vorher eine Variable liegt, die immer eins ist, wird da auch nie was anderes rauskommen.

Zufallszahlen macht man bspw. so:
http://www2.informatik.uni-halle.de/lehre/c/c_random…

Gruß Christian

// Generiere Zufallszahl zwischen 1 und Bereich
ZufallsZahl = rand() % Bereich + 1;

Die Variable Bereich sollte natürlich vor dem Generieren der Zufallszahl den gewünschten Wert besitzen.

Zusätzliches Include nötig:
#include

Weitere Infos z.B. unter: http://www.cplusplus.com/reference/cstdlib/rand/

Hallo Blanus,

ich sehe, dass du in der Funktion Spielen() eine Integer-Variable namens ZufallsZahl deklarierst. Ich sehe aber nirgends eine Zuweisung. Damit ist ja nur der Speicher reserviert, was da drin steht, ist nicht definiert, kann totaler Blödsinn sein. Bei int zwischen -2147483648 und 2147483647, bei short unsigned int zwischen 0 und 65535. Ich sehe auch keinen Zusammenhang zwischen ZufallsZahl und Bereich -
du willst aber doch einen Wert zwischen 1 und „Bereich“, richtig? Dazu kannst du dir mal folgenden Forumsbeitrag anschauen:
http://www.computerbase.de/forum/showthread.php?t=10…
Ich hoffe, das hilft dir weiter.
Grüße
Burkhard

PS du kannst „void main()“ benutzen, dann sparst du dir das „return 0“ am Ende

Was ich noch vergessen hatte - damit du nicht immer dieselben Zufallszahlen erhälst, solltest du ganz am Anfang in main() einmalig den Generator initialisieren:

srand(time(NULL));

Nötige Includes:
#include // für NULL
#include // für time()

Wo ist das ein Zufallszahlengenerator?

Ich sehe nur eine Variable ZufallsZahl, welche nicht initialisiert wird!

„Nicht Initialisiert“ bedeutet aber, dass der Wert nicht bestimmt ist. Da kann aber immer der selbe Wert drin sein!

MfG Peter(TOO)

Du setzt die Variable ‚ZufallsZahl‘ gar nie. Der Speicherbereich wird deshalb nie initialisiert und hat deshalb einen undefinierten Wert. Dieser ist vermutlich von der vorherigen Abfrage zufälligerweise auf dem Wert des Levels oder des Bereiches.

Wie der Zufallsgenerator in C heisst weiss ich leider nicht mehr, aber bei Google solltest du, wenn du nach rand oder random suchst, die Funktion und den evtl. Nötigen include finden.

Hallo Blanus,
warum ich ausgewählt wurde, ist mir schleierhaft, aber was soll’s.
Die Funktion, in der eine Zufallszahl gebraucht wird, scheint mit nicht korrekt zu sein. Es wird nur eine Variable definiert, ohne das eine Wertzuweisung erfolgt. Aber mit C oder C++ arbeit ich schon lange nicht mehr.
Sorry.
WM

Zusatzinformation zu meiner Antwort von gestern Abend:

Der Zufallsgenerator in C ist in der stdlib.

Das setzen der ZufallsZahl könnte dann etwa so aussehen:

#include 
#include 

(...)

/\*Initialisieren des Random-Generators, nur einmal (beim Start des Programmes)\*/
srand(time(NULL));

(...)

/\* Zufallszahl generieren \*/
ZufallsZahl = rand() % (Bereich + 1);

PS: Bitte das nächste mal den Code entsprechend auszeichnen (siehe FAQ:3090), es erleichtert das lesen besonders bei längerem Code mit Funktionen etc.

Hi Blanus,

an welcher Stelle benutzt du denn den Geneator?
Will heißen, wo initialisierst du denn ZufallsZahl mit einem Wert?

LG

bb

Hallo Blanus,

ich habe Dein Programm mit Microsoft Visual Studio 2008 kompiliert und gelingkt. Beied Schritte laufen fehlerfrei durch. Im Debug-Modus stürzt das Programm nach der Eingabe von „N“ ab. Im Release-Modus stürzt es nicht ab. Macht aber nicht das, was Du beschreibst. Das könnte daran liegen, dass Du eventuell einen anderen Compiler/Linker benutzt. Was benutzt Du? Der Grund für den Absturz ist, dass in der Methode int Spielen (int Level) die int-Variable ZufallsZahl nicht initialisiert wurde. Der Wert dieser Variablen ist also irgend etwas, was gerade im Speicher steht. Du solltest dort also sowas schreiben wie:
int ZufallsZahl=1;

Noch eine Bemerkungen zu Deinem Programm: Ich habe keine Stelle gefunden, an der die zufälligen Zahlen, die dann geraten werden sollen, erzeugt werden. Willst Du das noch implementieren? Eine Möglichkeit wäre:

int ZufallsZahl = ceil (double(Bereich) * double( rand()) / ( double(RAND_MAX)));

Falls Du weitere Fragen hast, melde Dich bitte.

oldfurt