random (10) begrenzen



  • Hallo leute ich habe mal eine Frage.
    ich möchte gerne in eine forschleife zufall erzeugen, das nicht
    zweimal vorkommt.
    hat einer eine idee?

    //--Diese Variante klappt leider rnicht

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      randomize();
      for (int x = 0; x<7;x++)
      {
      Zufall = random(7)+0;
      if (Zufall==Zufall)
         {
         Zufall= random(7)+0;
         }
      ListBox1->AddItem(IntToStr (Zufall),0) ;
      }
    }
    

    Dank im vorraus!



  • Du mußt dir alle bisherigen Zahlen merken und vergleichen. (etwas ausführlicher wird's hier)



  • Danke für den Tip CStoll 👍
    ja eine zweite forschleife in die erste schleife einbauen!
    das habe ich nun ausprobiert leider nach einigen test durchläufen,
    habe ich in der liste immer noch manchmal zwei gleiche Zahlen.

    int Check[7];
      int Zufall;
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      randomize();
      for (int x = 0; x<7;x++)
          {
    
           Zufall = random(7)+0;
           Check[x] =Zufall;
           for(int y= 0 ;y!=x;y++)
              {
    
              if (Check[y]==Zufall)
                 {
                  Zufall = random(7)+0;
                 }
              }
    
       ListBox1->AddItem(IntToStr (Zufall),0) ;
      }
    }
    

    Vieleicht eine Idee warum Diese Variante nicht funktioniert?
    Dank im vorraus!



  • Du solltest die neue Zahl erst in dein Array eintragen, wenn du die Überprüfung durch hast.

    (PS: Und um sieben verschiedene Zahlen zwischen 0 und 6 zu bestimmen, bietet sich vermutlich random_shuffle() an)



  • ich weis, ist nicht sonderlich schön, aber damit sollte es funktioniern:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      randomize();
      for (int x = 0; x<7;x++)
      {
    
        Zufall = random(7)+0;
        Check[x] =Zufall;
        for(int y= 0 ;y!=x;y++)
        {
    
          if (Check[y]==Zufall)
          {
            x--;
          }
          else
          {
            ListBox1->AddItem(IntToStr (Zufall),0) ;
          }
        }
    
      }
    }
    


  • Bitte die Code-Tags verwenden. Danke!



  • Wie wärs mit einem Vektor?

    std::set<int>zahl;
      randomize();
      while (zahl.size() < 15)
      {
       zahl.insert(rand()%80 + 1);
      }
    
      std::vector<int>zahl_vector(zahl.begin(), zahl.end()); //Umwandeln nach Vektor
    
      //------------------------------------------- String basteln und Ausgeben
    
      for (i = 0; i <= 14; i++)
     {
      randomset[i] = zahl_vector[i];
      v = v + "   " + IntToStr(zahl_vector[i]);
      Form7->Label2->Caption = v;
    
     }
    


  • ich denke da eher an sowas wie

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      int Check[7]={0};//die anderen 6 nullen macht der compiler selber rein
      randomize();//besser nur einmal irgendwo in er main() oder so
      for (int x = 0; x<7;x++)//siebenmal machen
      {
         int Zufall;
         do
           Zufall = random(7)+0;//würfeln
         while(!Check[Zufall]);//solange wiederholen, bis noch nicht genommene zahl
         Check[Zufall]=1;//zahl als genommen markieren
         ListBox1->AddItem(IntToStr (Zufall),0);//und ab in die anzeige
      }
    }
    


  • Nur mal eine Frage aus Neugierde - was soll eigentlich das "+0" bei der Zufallsberechnung bewirken?



  • CStoll schrieb:

    Nur mal eine Frage aus Neugierde - was soll eigentlich das "+0" bei der Zufallsberechnung bewirken?

    ich schätze, es erlaubt, die wertemenge schneller zu erfassen, wenn man es immer verwendet.



  • Hallo alle ,
    ich möchte mich 1. von allen für die tollen Kommentare bedanken!!
    ich habe auch das beispiel von volkard ausprobiert. leider stuerz mein programm beim compoiliern immer wieder ab. vieleicht seht ihr hier ja ein fehler,was ich übersehen habe.
    dank im voraus!!!

    int Check[7]={0};//die anderen 6 nullen macht der compiler selber rein
      int Zufall;
     //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      for (int x = 0; x<7;x++)//siebenmal machen
      {
    
         do
           {
           Zufall = random(7)+0;//würfeln
           }
         while(!Check[Zufall]);//solange wiederholen, bis noch nicht genommene zahl
         {
         Check[Zufall]=1;//zahl als genommen markieren
         ListBox1->AddItem(IntToStr(Zufall),0);
         }
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    
      randomize();//besser nur einmal irgendwo in er main() oder so
    
    }
    


  • amatuer schrieb:

    leider stuerz mein programm beim compoiliern immer wieder ab.

    beim compilieren?
    ich würde es verstehen, wenn die funktion nur einmal funktionieren würde und beim zweitenmal abstürzen würde.
    weil int Check[7]={0}; nämlich echt ein lokales array in der funktion sein sollte, damit es auch jedesmal vor dem verwenden aufs neue mit nullen gefüllt wird.

    edit:
    uups,
    while(!Check[Zufall])
    ist falsch

    while(Check[Zufall]==1)
    war gemeint.



  • Wenn er sowieso immer alle Zahlen braucht währe sowas ratsamer:

    int zahlen[7]={0,1,2,3,4,5,6};
    randomize();
    random_shuffle(zahlen,zahlen+7);
    for(int i=0;i<7;i++) ListBox1->Items->Add(zahlen[i]);
    


  • shuffler schrieb:

    Wenn er sowieso immer alle Zahlen braucht währe sowas ratsamer:

    int zahlen[7]={0,1,2,3,4,5,6};
    randomize();
    random_shuffle(zahlen,zahlen+7);
    for(int i=0;i<7;i++) ListBox1->Items->Add(zahlen[i]);
    

    ja, kann schon sein. wie gehabt randomize() besser raus in die TForm1::FormCreate().
    ich wollte keine magische funktion vorstellen, die irgendwas irgendwie macht, sondern eine, die er komplett kapiert und die er dann auch beliebig anpassen kann.


Anmelden zum Antworten