Zufallszahl alternativ berechnen?

Von: , Frage gestellt am Mo, 4. Jan 2010

Guten Tag,


Ich hab das Problem, dass in meinem Programm so einiges Flasch läuft. Ich habe vor, zu errechnen, wie oft man einen 2x2x2 Rubik's Cube absolut zufällig drehen müsste, bis er gelöst ist, aber das nur als Randbemerkung.

Ich berechne für jeden möglichen 'Zug' (Möglichkeiten: Left/Right/...) eine Zufallszahl. Nur leider entstehen, wenn ich nicht nach jedem Generieren ein 'enter' einfordere, bei 500 generierten zahlen nur zwei verschiedene: Er macht diese ja bekanntlich von der Zeit abhängig, aber anscheinend ist er zu schnell im berechnen. Wisst ihr, wie ich mein Programm vernümpftig zum laufen bringen kann?
Das Problem sind im Moment wirklich nur die Zufallszahlen, da diese sich nicht schnell genug ändern sondern den Wert beibehalten.

Hoffe mir kann jemand Helfen!

LG
Shisu

7 Antworten zu dieser Frage

  1. Antwort von nach 9 Minuten 0 hilfreich
    Re: Zufallszahl alternativ berechnen?

    Hallo Shisu,

    Der Fehler ist in Zeile 69!



    Aber im Ernst, wenn wir nicht wissen wie du den Zufallsgenerator ansteuerst, wissen wir auch nicht was du falsch machst.

    Also poste hier mal zumindest den Code, welche die Zufallszahlen erzeugt.

    MfG Peter(TOO)

    • Antwort von nach 13 Minuten 0 hilfreich
      Re^2: Zufallszahl alternativ berechnen?

      Huhu!

      Entschuldige, jeder muss es erstmal lernen... Also, die Funktion lautet:

      int Wuerfel::random(int grenze)
      {
      srand((unsigned)time(NULL));
      return (1+(rand()%grenze));
      }
      


      Dies gibt auch die entsprechenden Zahlen aus, jedoch leider nicht, wenn ich sie 'direkt' hintereinander berechnen lasse, dann ist er anscheinend zu schnell. Zugreifen tue ich auf die Funktion dann mittels:

      zahl = wuerfel.random(12);
      


      Liebe Grüße und Sorry wegen den Startschwierigkeiten =D
      Shisu

      • Antwort von nach 38 Minuten 0 hilfreich
        Re^3: Zufallszahl alternativ berechnen?

        Howdy, int Wuerfel::random(int grenze)
        {
        srand((unsigned)time(NULL));
        return (1+(rand()%grenze));
        }
        srand setzt den Initialwert fuer die Zufallszahlen.
        Wenn du Wuerfel::random ganz schnell hintereinander aufrufst und die aktuelle Zeit waere 42, dann haettest du die Sequenz

        srand(42);
        ... rand()
        srand(42);
        ... rand();
        


        und da muss der Pseudozufallszahlengenerator immer den gleichen Wert liefern. Besser ist es, du initialisierst einmalig srand() (z.B. in main()) und rufst danach in deiner random() Methode nur noch rand() auf.

        Gruss
        norsemanna

        • Antwort von nach 45 Minuten 0 hilfreich
          Re^4: Zufallszahl alternativ berechnen?

          Huhu!

          Ja, jetzt spuckt der PC schöne Zufallszahlen aus, danke!!
          Aber nochmal zum verständniss: Ich sollte dabei also immer nur einmal die Funktion initialisieren? Dami ichs demnächst nicht falsch mache ;)

          Denn es wäre eine glatte Lüge, wenn ich behaupten würde, ich wüsste, wie dieser Zufallsgenerator Funktioniert. Im Allgemeinen weiß ichs, im Deatil habe ichs nur aus ner Website kopiert.

          Liebe Grüße und riesen Dank!
          Shisu

          • Antwort von nach einer Stunde 0 hilfreich
            Re^5: Zufallszahl alternativ berechnen?

            Huhu!

            Ja, jetzt spuckt der PC schöne Zufallszahlen aus, danke!!
            Aber nochmal zum verständniss: Ich sollte dabei also immer nur
            einmal die Funktion initialisieren? Dami ichs demnächst nicht
            falsch mache ;)
            Applikationen, die Pseudozufallszahlen benoetigen, sollten srand einmalig aufrufen (so wie dein Programm).

            Applikationen, die dieselbe Sequenz von Pseudozufallszahlen mehrfach benoetigen, koennten srand auch mehrmals aufrufen. Denn es wäre eine glatte Lüge, wenn ich behaupten würde, ich
            wüsste, wie dieser Zufallsgenerator Funktioniert. Im
            Allgemeinen weiß ichs, im Deatil habe ichs nur aus ner Website
            kopiert.
            Lies
            http://de.wikipedia.org/wiki/Zufallszahlengenerator

            Gruss
            norsemanna

            • Antwort von nach einer Stunde 0 hilfreich
              Re^6: Zufallszahl alternativ berechnen?

              Danke!!

              *Close*

      • Antwort von nach 49 Minuten 0 hilfreich
        Re^3: Zufallszahl alternativ berechnen?

        Servus,

        Es ist nicht nötig, "srand" bei jedem Durchlauf auszuführen, da sie nur zur Anfangsinitialisierung dienen sollte.
        Könnte folgendermaßen ausschauen: ( Am besten aber in den Konstruktor verfrachten )

        int Wuerfel::random(int grenze)
        {
        static bool bRandInit = false;
        if(!bRandInit)
        {
        srand((unsigned)time(NULL));
        bRandInit = true;
        }
        return (1+(rand()%grenze));
        }
        

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!