Announcement

Collapse
No announcement yet.

Zufallszahlen !

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zufallszahlen !

    Hallo,

    Entschuldigung das ich schon wieder mit diesem Thema komme aber ich bekomme einfach keine Zufallszahlen (ohne doppelte und ich will nicht diese gestellte Funktion vom Christian verwenden)

    bsp:

    srand(time(NULL));

    int zufall=rand()%(anz);
    String Wort=mem_woerter->Lines->Strings[zufall];

    diesen Schritt will ich genauso haben eben nur ohne doppelte (also ohne gleiche Zahlen hintereinander zu ziehen).

    kann mir da keiner ein leichteres bsp sagen.

    Danke schon einmal im voraus.

  • #2
    Und wieder die gleiche Antwort:

    Das geht nicht!

    Zufallszahl ziehen, merken und bei erneuter Ziehung prüfen, ob schon mal gezogen. Üblcherweise schreibt man dazu eine Funktion, die die Zahl zieht und eine entsprechende Prüfung vornimmt

    Es gibt keinen Befehl der das abhandelt
    Christian

    Comment


    • #3
      ja kk wie mach ich dann nun diese funktion bei mir rein ?

      Comment


      • #4
        String Wort=mem_woerter->Lines->Strings[GetZahl()];

        .....


        int DasFormular::GetZahl()
        {
        int zufall=rand()%(anz);
        .......
        Zufallszahl ermittlen, prüfen ob sie schon gezogen wurde

        return zufall;
        }

        Die funktion wird als privat in die Klasse des Formulars aufgenommen, ev. benötogte globale Variablen ebenfalls.
        Christian

        Comment


        • #5
          ? sry aber wo soll ich alle hinschreiben blick gerade nicht durch.
          Soll ich dir mal Beispielcode zeigen? wäre dann einfacher!
          ach und nochwas ist das get zahl nicht normalerweise GetNumber();



          P.S.: hab ein kleines Problem ich benutze viele Variablen (Integer) die ich hochzähle (bsp. Rundenversuche usw.)

          so ich will diese wenn ich dieses Fenster zumache oder es durch irgendwas geschlossen wird die Werte auf Null setzen.

          runden=0;
          win=0;

          Ich hab es schon in Close,Destroy überall probiert geht aber nicht !!!

          Comment


          • #6
            Eine Klasse mit einer Funktion und einer Klassenvariablen:

            in der Headerdatei

            class Beispielklasse {
            int anzahl;
            public:
            void f(int i); // Deklaration einer Elementfunktion
            };

            ...

            in der CPP Datei

            void Beispielklasse::f(int i) // Definition der oben deklarierten Elementfunktion
            {
            anzahl += i;
            }


            die "Beispielklasse" ist die deines Formulars.

            ach und nochwas ist das get zahl nicht normalerweise GetNumber();
            Eine Klassenfunktion kann grundsätzlich heissen, wie sie will.


            Ich hab es schon in Close,Destroy überall probiert geht aber nicht !!!
            Das ist eher unwahrscheinlich ......wird dann wohl ein konzeptionlles Problem sein
            Christian

            Comment


            • #7
              nein das meinte ich nicht !!

              wie ich funktionen erstelle ist mir klar!


              Meine eigentliche Frage (es hört sich dumm an) ist wie ich deine funktion nun anwenden soll.

              Was muss ich nun anstatt

              srand(time(NULL));

              zufall=rand()%(anz);
              Wort=mem_woerter->Lines->Strings[zufall];

              hinschreiben ich weiß du hast es oben schon einmal erwähnt aber ich verstehe das nicht !

              und was muss ich mit dem Zip machen muss ich alle Dateien in meinen Ordner ziehen? un was soll ich mit der *.cpp machen soll ich die Sachen rauskopieren oder soll ich die irgendwie einbinden (was ich noch nie gemacht habe wenn das geht)?

              Comment


              • #8
                Ich gebe auf:

                und ich will nicht diese gestellte Funktion vom Christian verwenden
                Üblcherweise schreibt man dazu eine Funktion, die die
                ja kk wie mach ich dann nun diese funktion bei mir rein ?
                Meine eigentliche Frage (es hört sich dumm an) ist wie ich deine funktion nun anwenden soll.

                Erst sagst du, du willst sie nicht verwenden

                ich teile dir mit, du musst deine eigene Routine schreiben

                nun redest du völlig übergangslos wieder von der Komponente.

                Bei anderen Fragen gerne ......
                Christian

                Comment


                • #9
                  Entschuldigung aber ich hasse Zufallszahlen da rede ich gerne ein bisschen komisches Zeug !! sry falls ich so sehr nerve !!!

                  Comment


                  • #10
                    also ich hab dich so verstanden, dass du randomzahlen verwenden möchtest, allerdings dürfen die nicht schon vorgekommen sein.
                    ich bin zwar selbst noch anfänger, aber ich hab mir so eine funktion gebastelt.
                    Code:
                    int TForm1::RandZahl()
                    {
                    bool check=false;
                    int x;
                    x=random(20);
                    if(lauf){
                      for (int y=0;y<lauf;y++)
                        if (zufall[y]==x)
                          check=true;}
                    else{
                      zufall[0]=x;
                      for (int y=0;y<lauf;y++)
                        if (zufall[y]==x)
                          check=true;}
                    if(check)
                      return RandZahl();
                    else{
                      zufall[lauf]=x;
                      return x;}
                    }
                    lauf ist eine integer variable die mit 0 initialisiert wird und bei jedem durchgang, bei dem ich eine neue randomzahl ziehe, um 1 erhöht wird.
                    zufall[x] ist wie man wohl erkennen mag ein int array mit beliebiger größe, halt so groß wie man es braucht.
                    also wenn du in deinem programm nun eine neue randomzahl brauchst, rufst du einfach diese funktion auf, aber pass auf, wenn du z.b. eine zahl zwischen 1-20 ziehst und 20 zahlen ziehst, stürzt das programm beim letztem durchlauf ab, weil es keine zahl mehr gibt die nicht schon gezogen wurde und die funktion somit in einer endlosschleife landet ^^
                    hoffe ich kann dir damit helfen.

                    Gruß

                    Comment


                    • #11
                      stürzt das programm beim letztem durchlauf ab, weil es keine zahl mehr gibt die nicht schon gezogen wurde und die funktion somit in einer endlosschleife landet
                      Es landet nicht in einer Endlosschleife -> vielmehr hast du rekursiv programmiert und eine Abbruchbedingung (lauf=Größe des Array) vergessen zu implementieren. Somit ruft sich die Routine immer wieder selbst auf mit

                      if(check)
                      return RandZahl();

                      solange bis der Stack überläuft.

                      Wie wäre es mit einer Schleife statt einem rekusivem Aufruf?

                      ziehe Zufallszahl, solange bis check==false
                      Zuletzt editiert von Christian Marquardt; 10.04.2007, 07:28.
                      Christian

                      Comment


                      • #12
                        sorry, was bedeutet rekursiver aufruf ?
                        aber eigentlich funktioniert es doch auch oder ? und dieser stack overflow passiert ja nicht wenn man alles logisch lässt, sodass man nicht mehr unterschiedliche zahlen haben will als möglich ist.

                        Comment


                        • #13
                          ein rekursiver Aufruf ist ein Aufruf einer Funktion die sich immer wieder selbst aufruft.

                          http://de.wikipedia.org/wiki/Rekursion
                          Christian

                          Comment


                          • #14
                            ? geht das was er gemacht hat ? kann man das verwenden

                            Comment


                            • #15
                              also ich sage ja das funktioniert, wenn du halt aufpasst das du nicht mehr zahlen haben willst als überhaupt möglich ist

                              aber Christian ist da viel erfahrener und dann würde ich halt meinen rekursiven aufruf durch eine schleife ersetzen mit einer abbruchbedingung wie er schon sagte.

                              Gruß

                              Comment

                              Working...
                              X