[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;
        }
    //blabla
    

    So 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;-):D

    danke 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:D

    also danke nochmal:-P


Anmelden zum Antworten