[Gelöst]Problem mit "Zufallsgenerator"
-
Hey Leute,
ich brauche in meinem programm einen "Zufallsgenerator", also die Funktion rand();
mit rand klappt auch alles, dass er auch nur die Zahlen erzeugt in dem Bereich wo ichs brauch, jedoch klappt dass mit srand(time(NULL)); net so ganz
ich benutze rand in 2 funktionen, und habe srand dann in main initalisiert.
jedoch erzeugt er immer die gleichen zahlen=(
wieso?
kann mir bitte einer helfen=)
-
code zeigen
-
Hallo,
also ohne deinen Quelltext können wir hier nichts machen. Dennoch könntest Du dein Programm mal mit diesem vergleichen:Random.h: #ifndef _RANDOM_ #define _RANDOM_ class random { private: int min,max; void randomSeed(void); public: void init(int i_min, int i_max); int random(void); }; #endif //-------------------------------------------------------- Random.cpp: #include <iostream> #include <ctime> #include "Random.h" using namespace std; void random::randomSeed() { unsigned int seed = (unsigned int)time(NULL); srand(seed); } void random::init(int i_min, int i_max) { max = i_max; min = i_min; randomSeed(); } int random::random(void) { return min + rand()%(max+1 - min); }lg, freakC++
-
int random::random(void) { return min + rand()%(max+1 - min); }Seit wann hat der Konstruktor nen Rückgabewert?
-
ups...ich habs falsch aus meinen Unterlagen abgeschrieben: Die Klasse soll "Random" heißen und die Methode "random"...sorry
lg, freakC++
-
okidoki, setzt euch mal den teil rein um den es geht, denk mal ist dann leichter den fehler zu finden als vll alles durchzulesen.
main.cpp#include <iostream> #include <iomanip> #include <string> #include "classFeld.h" using namespace std; void setzenSchiffe(Feld**, int, int); void setzenSchiffeCPU(Feld**, int, int); void ausgebenFelder(Feld**, int, int); void ausgebenFelderCPU(Feld**, int, int); void eingabe(Feld**, int, int); void eingabeCPU(Feld**, int, int); bool checkEnd(Feld**, int); bool checkEndCPU(Feld**, int); int angabeX; int main() { srand(time(0)); cout << setw(63) << "Herzlich Willkommen zu Schiffe versenken=)" << endl; marke:; cout << "\nWie gross soll das Spielfeld sein,(min.8) (x-Angabe)?"; cin >> angabeX; //blablabla setzenSchiffe(pFeld, angabeX, felder); setzenSchiffeCPU(pFeld2, angabeX, felder); cout << endl; ausgebenFelder(pFeld, felder, angabeX); cout << endl; ausgebenFelderCPU(pFeld, felder, angabeX); //blabla while(true) { eingabe(pFeld, felder, angabeX); ausgebenFelder(pFeld, felder, angabeX); if (checkEnd(pFeld, felder)) { break; } eingabeCPU(pFeld2, felder, angabeX); ausgebenFelderCPU(pFeld2, felder, angabeX); if (checkEndCPU(pFeld2, felder)) { break; } } return 0; }funktionen.cpp
void setzenSchiffeCPU(Feld** pFeld2, int angabeX, int felder) { int x; int y; int achse; for (int i = 0; i < 5; i++) { marke:; x = (rand()%(angabeX + 1)); y = (rand()%(angabeX + 1)); achse = rand()%3; if((achse == 1 && x > angabeX - 2) || (achse == 1 && y > angabeX)) { continue; } //blabla void eingabeCPU(Feld** pFeld2, int felder, int angabeX) { int x; int y; marke:; x = (rand()%(angabeX + 1)); y = (rand()%(angabeX + 1)); if (x == 0 || x > angabeX) { cout << "Ungueltige Eingabe!\n"; goto marke; } else if (y == 0 || y > angabeX) { cout << "Ungueltige Eingabe!\n"; goto marke; } //blablaSo also hoff mal der code reicht euch, in der main steht noch mehr und in funktionen.cpp auch, die beiden funktionen selber habe ich auch nicht vollständig kopiert.
falls ihr mehr braucht sagts nur, kann auch gern alles kopieren;-):Ddanke schonmal
ps: ja ich weiß goto ist sehhhr schlecht:D bin noch dabei des wegzumachen:)
-
Am Setzen von srand und am direkten Aufruf von rand()%(N+1) sollte es nicht liegen. Das scheint andere Gründe zu haben. An der Ausgabe vielleicht?
-
Nutzt du Threads? Dort musst du evtl. für jeden Thread srand neu initialisieren.
-
ehm was sind den threads???
ich schau nochmal die ausgabe durch ob ich da was finde...
das komische ist, ich benutze ja rand in 2 funktionen, einmal bei der funktion wo der pc die schiffe setzt und einmal dort wo eben der pc auf meine felder schießt.
dort wo er schießt klappt es und es ändert sich immer, dort wo er die schiffe setzt jedoch nicht...
-
unsigned int seed = (unsigned int)time(NULL); srand(seed);Also wenn ich ein Objekt von random erzeuge, dann veraendere ich den seed von allen anderen random-Objekten und fuehre ein reset aus. Das ist kacke.
Auch verstehe ich nicht, was das soll: Erst ein Randomobjekt und dann doch wieder mit rand() ...
marke:; ... goto marke;ps: ja ich weiß goto ist sehhhr schlecht:D bin noch dabei des wegzumachen:)
Wegmachen? Einfach nicht einsetzen! In diesem Fall hier kann goto nur sehr schlecht gerechtfertigt werden.
-
Leute, hat sich erledigt, war mein fehler,
ich vogel wundere mich warum er immer die schiffe gleich setzt, dabei hattte ich was vertauscht sodass ich meine schiffe und er seine selber setzte:D:Dalso danke nochmal:-P