rand() Anweisung immer = 41
-
Also ich wollte gerne ein kleines Glückspiel erstellen, in dem es darum geht eine Zahl zwischen 1 und 100 zu erraten, doch meine Zufallszahl ist immer = 41.
Code:
int main() { int zahl1; int randomzahl=rand()%101; cout<<"Bitte eine Zahl zwischen 1 und 100 eingeben\n"<<endl; cin>>zahl1; if (zahl1==randomzahl) { cout<<"Richtig, die Zahl hiess: "<<randomzahl<<"\n"<<endl; } else { cout<<"Falsch, die Zahl hiess: "<<randomzahl<<"\n"<<endl; } cout.flush(); getch(); }Woran liegt das? In wiefern das ich die Anweisung rand() falsch behandelt?
-
Da fehlt ein srand( time( 0 ) ) am Anfang.
-
Vielen Dank, scheint jetzt zu funktionieren, vielen Dank.

-
#include <iostream> #include <ctime> #include <cstdlib> #include <limits> int main() { std::cout << "Zahlenraten V1.0" << std::endl; std::cout << "Bitte geben Sie eine beliebige Zahl zwischen 1 und 100 ein! " << std::flush; unsigned short num = 0; while (!(std::cin >> num) || num < 1 || num > 100) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } std::srand(std::time(0)); std::cout << ((std::rand() % 100 + 1) == num ? "Richtig!" : "Falsch!") << " Die Zahl hiess \"" << num << "\"." << std::endl; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.get(); }
So wird dir nix passieren wenn jemand a anstelle einer Zahl eingibt ... auch kann er wirklich nur Zahlen zwischen 1 und 100 eingeben
-
(D)evil: Soweit bin ich jetzt noch nichts in C++ *G*
Aber das kommt schon noch. Ich hab folgende Frage/Probleme und zwar:
Wie kann ich das rand() in eine gesonderte Funktion tun.So siehts im Moment aus:
int main() { int eingabezahl(time(0)); int nochmal=0; cout<<"Bitte eine Zahl zwischen 1 und 100 eingeben:"<<endl; cin>>eingabezahl; if (eingabezahl==Randomzahl()) { cout<<"Richtig, die Zahl hiess: "<<Randomzahl()<<"\n"<<endl; } else { cout<<"Falsch, die Zahl hiess: "<<Randomzahl<<"\n"<<endl; } getch(); } int Randomzahl() { srand(time(0)); return = rand()%100+1; }Er gibt mir den Fehler: "14 `Randomzahl' undeclared (first use this function) " aus. Es ist die If-Abfrage, wo er zum ersten mal vor "Randomzahl()" steht.
-
der compiler geht den code vom anfang bis zum ende durch, zum zeitpunkt wo du die funktion aufrufst, gibt es diese noch nicht.
schieb die funktion also einfach über die main und alles sollte funktionieren

-
wobei das nicht dein fehler ist, du hasst da, wo du die richtige random zahl ausgeben willst randomzahl hingeschrieben, erstens ohne "()" und zweitens wird dir das eine neue random zahl generieren.
musst die also irgendwo in der main zwischenspeichern.
der compilerfehler rührt aufjeden fall von den nicht vorhandenen "()" her.
-
da sind ausserdem noch weitere fehler. du brauchst den random generator nur einmal aufrufen, nicht jedesmal wieder und return weißt man nichts zu.
also nicht: "return = rand();" sondern "return rand();"
-
int rand(unsigned short low = 1, unsigned short up = 100) { return std::rand() % up + low; }... und return ist keine "Variable" der du einen Wert zuweißt ... nicht wie in Delphi(das ist eine scheiß Sprache ... bringt viel Mist mitsich) ... einfach den Rückgabewert angeben ...
std::srand soll man nur 1mal im Programm aufrufen ... d.h. ruf es einfach im main auf ...@using namespace std-Fans: na jetzt würdet ihr ein Problem haben

-
Delphi hab ich als letztes gleernt, allerdings schul bedingt. Daher auch mein "="

Also ich hab das Ding jetzt zum laufen gebracht. Hab den Wert in der Main in eine Variable abspeichern lassen, da mir beim Coden schon auffiel das ich dann 3 verschiedene Zahlen bekommen würde und das wollte ich ja nicht.
Warum sollte man std::srand nur einmal im Programm aufrufen?
Und was meinst du mit:
"@using namespace std-Fans: na jetzt würdet ihr ein Problem haben" ???
-
Hmm ... also ... ich erkläre mal meinen Code dann kommst du vllt selbst drauf ...
#include <iostream> // std::cout, std::cin #include <ctime> // std::time /* nicht time.h nutzen! */ #include <cstdlib> // std::srand, std::rand /* nicht stdlib.h nutzen! */ #include <limits> // std::numeric_limits int main() { std::cout << "Zahlenraten V1.0" << std::endl; std::cout << "Bitte geben Sie eine beliebige Zahl zwischen 1 und 100 ein! " << std::flush; unsigned short num = 0; while (!(std::cin >> num) || num < 1 || num > 100) // konnte die Eingabe in einen unsigned short gepackt werden? Ist die Zahl im Zahlenbereich 1 - 100? { // nein! std::cin.clear(); // alle status und failbits zurücksetzen! std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } std::srand(std::time(0)); // std::rand initialisieren. Als Wert die aktuelle Zeit ... => scheinbare Zufälle! std::cout << ((std::rand() % 100 + 1) == num ? "Richtig!" : "Falsch!") << " Die Zahl hiess \"" << num << "\"." << std::endl; // if (std::rand() % 100 + 1 == num) std::cout << "Richtig!"; else std::cout << "Falsch!"; std::cout << Die Zahl hiess \"" << num << "\"." << std::endl; wäre die ausführliche Schreibweise. /* ersetzt getch() */ ... std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.get(); }so und nun zu dem von wegen usign namespace ...
int rand(unsigned short low = 1, unsigned short up = 100) { return std::rand() % up + low; } usign namespace std; int main() { srand(time(0)); cout << rand() << endl; // welches rand soll er denn jetzt nehmen? das im global scope oder das aus std? }
-
(D)Evil dein Code ist unfair. Wie soll man eine Zahl erraten die es noch gar nicht gibt

-
(D)Evil schrieb:
so und nun zu dem von wegen usign namespace ...
int rand(unsigned short low = 1, unsigned short up = 100) { return std::rand() % up + low; } usign namespace std; int main() { srand(time(0)); cout << rand() << endl; // welches rand soll er denn jetzt nehmen? das im global scope oder das aus std? }Richtig. Da gibt es jetzt gar keine Lösung
Die Welt ist nämlich entweder schwarz oder weiß, niemals grau. Wer using-Direktiven verwendet darf niemals qualifizieren und wer der qualifiziert darf niemals usen. So spricht das Gesetzt und wenn das spricht, hat das Hirn Pause 
Ne, mal ehrlich, dir ist schon klar, dass du using-Direktiven, using-Deklarationen und explizite Qualifikation frei mischen kannst.
int rand(unsigned short low = 1, unsigned short up = 100) { return std::rand() % up + low; } using namespace std; int main() { srand(time(0)); cout << ::rand() << endl; }Fertig und hat auch gar nicht weh getan.
-
int rand(unsigned short low = 1, unsigned short up = 100) { return std::rand() % up + low; }Darf ich mal fragen, ob dieser Code dazu gedacht ist, mir eine Zufallszahl zwischen low und up auszugeben? Weil er das nämlich nicht tut. Wenn ich das Ding aufrufe mit z.B.
int rnd = rand(80,100);dann kommt raus (nur ein Beispiel): 368 % 100 + 80 = 68 + 80 = 148.
Ich schei**e hier nur gerade klug, weil ich sowas selber gerade brauche und gerade nicht drauf kommen, wie man das denn wirklich machen sollte.Gruss. mbu.
-
int rand(unsigned lower, unsigned upper) { int range = upper - lower; return ( static_cast<float>( rand() ) / RAND_MAX ) * range + lower; }so zum bleistift
-
Super. Vielen Dank.