[C#] Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von onlinebenutzer, 21. Juni 2013 .

  1. 21. Juni 2013
    Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Hallo,

    ich habe eine Ausgabe, die mir immer einen Unterschiedlichen Text ausgeben soll. Sprich, es gibt Zeilen und diese dürfen bzw. sollten nie gleich sein.



    Diese Abfrage habe ich mir so realisiert:

    Code:
     void Abfrage_Menue_doppelt()
     {
     //ANFANG - Dekleration lokale Variabeln der Klasse
     if (bInit)
     {
     iarVorhanden = new int[8];
     bInit = false;
     }
     //ENDE - Dekleration lokale Variabeln der Klasse
    
     for (int x = 0; x < 7; x++)
     {
     [B]if (iarVorhanden[x] == iZufall)
     {
     Naechstes_Menue();
     }[/B]
     }
    
     if (iTagNummer == 7)
     {
     for (int b = 0; b < 7; b++)
     {
     iarVorhanden[b] = 0; 
     }
     return;
     }
     iarVorhanden[iTagNummer] = iZufall;
     }
     #endregion
    Leider bringt mir das Programm dennoch teilweise zweimal den selben Text raus und ich weiß einfach nicht warum. :angry:
    Es ist für mich unbegreiflich und auch übers Debuggen habe ich keine Ahnung warum er dies tut!? ?(


    Das ist der Code der bei doppeltem Eintrag aufgerufen wird.

    Code:
     void Naechstes_Menue()
     {
     txtAusgabe.Clear();
     Random rZufall = new Random();
     stTag = new string[iAnzahlEssenGesamt];
    
     Essen Essen = new Essen();
    
     butUebernehmen.Enabled = true;
    
     do
     {
     iZufall = rZufall.Next(iRandomMin, iRandomMax);
     }
     while (iZufallOld == iZufall);
     iZufallOld = iZufall;
    
     switch (iZufall)
     {
     case 1:
     txtAusgabe.Text = Essen.Essen1;
     butRezept.Enabled = true;
     break;
     case 2:
     txtAusgabe.Text = Essen.Essen2;
     butRezept.Enabled = false;
     break;
     case 3:
     txtAusgabe.Text = Essen.Essen3;
     butRezept.Enabled = false;
     break;
     case 4:
     txtAusgabe.Text = Essen.Essen4;
     butRezept.Enabled = false;
     break;
     case 5:
     txtAusgabe.Text = Essen.Essen5;
     butRezept.Enabled = false;
     break;
     case 6:
     txtAusgabe.Text = Essen.Essen6;
     butRezept.Enabled = false;
     break;
     case 7:
     txtAusgabe.Text = Essen.Essen7;
     butRezept.Enabled = false;
     break;
     case 8:
     txtAusgabe.Text = Essen.Essen8;
     butRezept.Enabled = false;
     break;
     default
     : txtAusgabe.Text = "Fehler";
     break;
     }
     stTag[iZufall] = txtAusgabe.Text;
     butRezept.Text = "Zutaten für: " + txtAusgabe.Text;
    
     }
     #endregion
     //Funktion für Neues Menü - ENDE
     
  2. 21. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Du holst dir 7 zufällige Zahlen, prüft aber nur ob die jeweils vorherige Zahl bereits ermittelt wurde.

    iZufall = 1 // erste zahl
    iZufall = 1 // nicht erlaubt, da die vorherige Zahl bereits 1 war
    iZufall = 2 // erlaubt, da vorherige Zahl nicht 2 war
    iZufall = 1 // erlaubt, da vorherige Zahl nicht 1 war

    Speicher dir daher alle bereits ermittelten Zahlen in einem int[] und prüfe damit.
     
  3. 21. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Ich muss gestehen, dass ich deinen Code nicht ganz verstehe, da er doch noch ziemlich unstrukturiert ist. Vorallem weis ich nicht woher deine ganzen Variablen kommen - die scheinst du alle global initialisiert zu haben...
    Falls ich also etwas nicht richtig verstanden habe korrigiere mich bitte.

    Du willst 7 unterschiedliche Essen ausgeben.
    Da versuchst du, indem du per for-Schleife über ein Array iterierst, in dem deine Zufallszahlen abgelegt werden, die jeweils für eines der Essen stehen.
    Code:
     
    for (int x = 0; x < 7; x++)
    {
     if (iarVorhanden[x] == iZufall)
     {
     Naechstes_Menue();
     }
    }
    
    Richtig?
    Wo setzt du denn dann in deinem iarVorhanden an den entsprechenden Stellen die Zufallszahl... den momentan stehen in dem Array ausschließlich Nullen.
    Außerdem solltest du dann nicht immer eine Stelle prüfen, sondern ob die momentane Zufallszahl im Gesamtarray vorkommt.


    Du solltest dringend an der Leserlichkeit deines Codes arbeiten.
     
  4. 24. Juni 2013
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Ich speichere diese doch in einem Array. Die obere Abfrage habe ich aus Verzweifelung eingefügt, ist jedoch eigentlich überflüssig.


    Ja, dies ist soweit korrekt verstanden.
    Die Zuweisung der Zufallszahl findet hier statt:

    Code:
    ...
     Naechstes_Menue();
     }
     }
    
     if (iTagNummer == 7)
     {
     for (int b = 0; b < 7; b++)
     {
     iarVorhanden[b] = 0; 
     }
     return;
     }
     [COLOR="Red"][B] iarVorhanden[iTagNummer] = iZufall;[/B][/COLOR]
     }
     #endregion
    Bild

    Und sorry der Code ist sehr unstrukturiert, bin aber noch am Anfang meiner Programmierung Und ja das muss ich machen, damit ich ihn auch wieder selbst verstehe
     
  5. 24. Juni 2013
    Zuletzt bearbeitet: 24. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Seh ich das falsch, oder wäre genau für das Hashmap das Richtige, Murdoc?

    E:/ oder eben ein Set.

    Dachte man könnte die Sätze jeweils hashen & anschließend ausgeben.

    E2:/ Hashmap mit "Satz" jeweils als Key & Value, danach die Hashmap ausgeben: riesen Speicher, sollte aber das Problem lösen: wieso einzeln manuell lösen?
     
  6. 24. Juni 2013
    Zuletzt bearbeitet: 24. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Nö, gibt ja nichts zu hashen
    Wenn dann würde ein Set Sinn machen, in dem kleinen Umfang aber auch per Hand über einen Array realisierbar.

    ---

    Ohne denn kompletten Code blicke ich aber nicht durch was du da vor hast.
    Am besten ist wohl wenn du dir bei deinem Prof. oder Kommilitonen Hilfe suchst.
     
  7. 24. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Ich glaube dein Problem besteht immer noch darin, dass du immer nur gegen einen Wert im Array prüfst, ob dieser dem momentanen Zufallswert entspricht...
    Du solltest aber alle Werte in deinem Array prüfen, ob dein momentaner Zufallswert an irgendeiner Poistion im Array schon vorhanden ist.

    Als Beispiel ein bisschen Code um zu verdeutlichen was ich meine...
    In der ersten for-Schleife kann es passieren, dass doppelte Zufalleszahlen an unterschiedlichen Arraypositionen landen.
    Bei der zweiten Variante ist das ausgeschlossen, da per Contains jedes Element im Array gegengeprüft wird...

    Code:
     int[] intarray = new int[8];
     Random rand = new Random();
    
     for (int i = 0; i < 8; i++)
     {
     int zufall;
     do
     {
     zufall = rand.Next(0, 10);
     } while (intarray[i] == zufall);
    
     intarray[i] = zufall;
     }
    
     for (int i = 0; i < 8; i++)
     {
     int zufall;
     do
     {
     zufall = rand.Next(0, 10);
     } while (intarray.Contains(zufall));
    
     intarray[i] = zufall;
     }
    
     
  8. 24. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Hallo,

    ich verstehe deine Antwort, aber ich prüfe doch hier jeden Wert des Arrays ab:

    Code:
     for (int x = 0; x < 7; x++)
     {
     if (iarVorhanden[x] == iZufall)
     {
     Naechstes_Menue();
     }
     }
     
  9. 24. Juni 2013
    Zuletzt bearbeitet: 24. Juni 2013
    AW: Doppelte Anzeige trotz Abfangen und vergleichen über Array!?

    Du möchtest n zufällige Zahlen ohne Dopplungen, oder?

    Code:
     class Program
     {
     static void Main(string[] args)
     {
     int[] random = GetUniqueRandomArray(0, 5, 5); //Ein Array mit 5 veschiedenen zufälligen zahlen zwischen (einschließlich) 0 und 5 erzeugen
    
     Console.WriteLine(string.Join(",", random));
     Console.Read();
     }
    
     private static int[] GetUniqueRandomArray(int minValue, int maxValue, int len)
     {
    
     maxValue++; //Macht meiner Meinung nach mehr Sinn, dass der Maximalwert auch erreicht werden kann.
    
     if (maxValue - minValue < len) //Wenn es weniger verschiedene Zahlen als freie Plätze gibt
     {
     return null; //Funktioniert der Algo logischer Weise nicht
     }
     
     int[] random = new int[len]; //Array mit der gewünschten Länge deklarieren
    
     Random r = new Random(DateTime.Now.Millisecond);
    
     for (int i = 0; i < random.Length; i++)
     {
     int randomInt = r.Next(minValue, maxValue); //Eine neue Zahl generieren
    
     while (random.Contains(randomInt)) //Solange die Zahl schon vorhanden ist
     {
     randomInt = r.Next(minValue, maxValue); //Eine neue Zahl generieren
     }
     random[i] = randomInt; //Zahl dem Array hinzufügen
     }
    
     return random; //Das Array zurückgeben
     }
     }
    Hab mal eine Funktion mit dem einfachst möglichem Algorithmus dazu gebaut. Nicht effizient aber für dein Problem mehr als ausreichend.

    //

    Hier auch mal mit HashSet, wie von lordosiris vorgeschlagen:

    Code:
     private static int[] GetUniqueRandomArray(int minValue, int maxValue, int len)
     {
    
     maxValue++; //Macht meiner Meinung nach mehr Sinn, dass der Maximalwert auch erreicht werden kann.
    
     if (maxValue - minValue < len) //Wenn es weniger verschiedene Zahlen als freie Plätze gibt
     {
     return null; //Funktioniert der Algo logischer Weise nicht
     }
     
    
     HashSet<int> random = new HashSet<int>(); //HashSet lässt keine Dopplungen zu
    
     Random r = new Random(DateTime.Now.Millisecond);
    
     while (random.Count != len) //Solange die geünschte Anzahl nicht erreich ist
     {
     random.Add(r.Next(minValue, maxValue)); //Neue Zahlen hinzufügen (bei Dopplung passiert nichts)
     }
    
     return random.ToArray(); //HashSet zum Array machen und zurückgeben
     }
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.