Zufallszahlen im Array ohne Wiederholung

Righteus

Mitglied
Erstmal Hallo ans Forum!

Ich verzweifle gerade an einer Hausaufgabe und mein Lehrer wollte mir natürlich den Fehler nicht sagen. Nach über eine Stunde rumprobieren bin ich immer noch nicht auf eine Lösung gekommen und hoffe nun, dass ihr mir vielleicht weiterhelfen könnt.

Zur Aufgabe: Wir sollen ein Array mit 10 Elementen erstellen. In diesem Array sollen nun 10 Zufallszahlen von 1-10 hinzugefügt werden, welche sich nicht wiederholen dürfen.

Der Fehler liegt darin, dass trotzdem verschiedene Zahlen doppelt vorkommen.

Ich hänge unten einfach mal den Code und hoffe ihr könnt mir helfen bzw findet meinen Fehler. :)

Java:
import java.awt.*;
import java.awt.event.*;
import java.math.*;

class Zufallszahlen_keine_doppelt {

   Zufallszahlen_keine_doppelt(){

     boolean flag = false;
     int a =0;
     int zahl[];
     zahl= new int [10];

     for(int i=0;i<10;i++){

              flag = false;

              a= (int) (Math.random()*10+1);

              for(int index=0;index<i;index++){

                       if(zahl[index] == a){

                             flag = true;

                                }//Ende if

                         if(flag==false){

                              zahl[i] = a ;
                                      
                              }//Ende if

                 }//Ende for index

      }//Ende for i



   for(int z=0;z<zahl.length;z++){

     System.out.println("  "+zahl[z] + "\n");

   }//Ende for z


}//Ende Methode

   public static void main (String arg[]){

     new Zufallszahlen_keine_doppelt();

   }
}//Ende class

MFG Righteus
 
Zuletzt bearbeitet:

Dirk S

Mitglied
Hallo,
Du prüfst zwar, ob Du eine Zufallszahl schon im Array hast und fügst diese nur hinzu, wenn dies nicht der Fall ist, aber egal, ob Du sie hinzufügst oder nicht, zählst Du den index (in der äusseren Schleife ja weiter hoch)
Du musst solange eine neue Zufallszahl suchen, bis Du eine gefunden hast, die Du hinzufügen kannst.
Wenn man Deinen Ansatz weiter verwenden will, also möglichst wenig Änderungen bei Dir vornehmen möchte, dann kannst Du einfach eine whileschleife einfügen, um den Teil wo Du die ZZ generierst bis dahin wo Du diese prüfst und ggf. einfügst, wenn Du eine ZZ gefunden und eingefüght hast verlässt Du die while Schleife, ansonsten bleibst Du drinnen, damit einen neue ZZ geholt wird, Der Code könnte dann Deinem Stil folgend so aussehen)


Java:
public class  Zufallszahlen_keine_doppelt {

   
     Zufallszahlen_keine_doppelt(){

         boolean flag = false;
         boolean added=false;
         int a =0;
         int zahl[];
         zahl= new int [10];

         for(int i=0;i<10;i++){
                   added=false;                 
                  while(!added){
                      flag = false;
                      a= (int) (Math.random()*10+1);                    
                      for(int index=0;index<i;index++){
                           if(zahl[index] == a){                                
                               flag=true; 
                               break;
                           }
                     }//Ende for index
                     if(!flag){
                         zahl[i] = a;
                         added=true;
                     }
                  }
          }
        
       for(int z=0;z<zahl.length;z++){

         System.out.println("  "+zahl[z] + "\n");

       }
    }
 

Righteus

Mitglied
Hallo,
Du prüfst zwar, ob Du eine Zufallszahl schon im Array hast und fügst diese nur hinzu, wenn dies nicht der Fall ist, aber egal, ob Du sie hinzufügst oder nicht, zählst Du den index (in der äusseren Schleife ja weiter hoch)
Du musst solange eine neue Zufallszahl suchen, bis Du eine gefunden hast, die Du hinzufügen kannst.
Wenn man Deinen Ansatz weiter verwenden will, also möglichst wenig Änderungen bei Dir vornehmen möchte, dann kannst Du einfach eine whileschleife einfügen, um den Teil wo Du die ZZ generierst bis dahin wo Du diese prüfst und ggf. einfügst, wenn Du eine ZZ gefunden und eingefüght hast verlässt Du die while Schleife, ansonsten bleibst Du drinnen, damit einen neue ZZ geholt wird, Der Code könnte dann Deinem Stil folgend so aussehen)


Java:
public class  Zufallszahlen_keine_doppelt {


     Zufallszahlen_keine_doppelt(){

         boolean flag = false;
         boolean added=false;
         int a =0;
         int zahl[];
         zahl= new int [10];

         for(int i=0;i<10;i++){
                   added=false;     
                  while(!added){
                      flag = false;
                      a= (int) (Math.random()*10+1);        
                      for(int index=0;index<i;index++){
                           if(zahl[index] == a){                    
                               flag=true;
                              break;
                      
                           }
                     }//Ende for index
                     if(!flag){
                         zahl[I] = a;
                         added=true;
                     }
                  }
          }

       for(int z=0;z<zahl.length;z++){

         System.out.println("  "+zahl[z] + "\n");

       }
    }

Vielen Dank für die Hilfe!

Ich hatte mir gestern schon überlegt, ob ich nicht eine while Schleife brauche wusste aber nicht, wie es vernüftig in mein Programm implementieren sollte. Ich hatte mein Fehler die ganze Zeit bei der Überprüfung gesucht, da ich dachte mein Programm macht dort etwas falsch. Ich hatte mir die Zufallszahlen auch während das Programm läuft ausgeben lassen, aber ich hab natürlich übersehen, dass diese ja am Ende nur 10 mal erzeugt wird.

Ich hab mir das jetzt nochmal selber geschrieben. Durch Copy and Paste lerne ich es ja nicht. :)

Aber eine frage hab ich noch: Was bewirkt denn dieses break;? (Hab es im oben Programm markiert (hoffe ich zumindest)) Meine abgeänderte Version funktioniert auch ohne das break :S.

Ich hänge das Programm einfach wieder an:
Java:
[/I]
[I]import java.awt.*;
import java.awt.event.*;
import java.math.*;

class Zufallszahlen_keine_doppelt {

   Zufallszahlen_keine_doppelt(){

  boolean flag = false; // solange flag=false -> läuft die Überprüfung/Neugenerierung von a
  boolean added = false; //solange added=false -> läuft die while Schleife
  int a =0; //Zufallszahl
     int zahl[];
     zahl= new int [10];

     for(int i=0;i<10;i++){

       added = false; //damit nach erfolgreichem Durchlauf der while Schleife diese wieder startet

       while(!added){ //wir wissen nicht, wie viele Durchläufe wir zur "richtigen" Zufallszahl brauchen (darf nicht 1x im Array sein; wenn sie es ist Neugenerierung-> könnte wieder die selbe sein)

         flag = false; // damit die erzeugte Zufallszahl nicht ins Array kommt

         a= (int) (Math.random()*10+1); //Erzeugung Zufallszahl

         for(int index=0;index<i;index++){ //wir wissen wie oft sie laufen muss -> for Schleife; Läuft durch alle bis dorthin vorhandenen Indizies des Arrays

          if(zahl[index] == a){ //Überprüfung, ob Zufallszahl schon im Array ist; durchläuft alle bis dato vorhandenen Indizies

              flag = true; //wenn Zufallszahl schon im Array ist wird falg auf true gesetzt -> d.h. sie kommt nicht durch die nächste if Überprüfung -> while läuft erneut ab

            }//Ende if

          }//Ende for index

          if(!flag){ //Überprüfung, ob flag auf false steht; wenn nicht dann wird die Schleife gar nicht erst gestartet -> while läuft erneut

            zahl[i] = a; // falls die Zufallszahl noch nicht im Array ist wird sie jetzt diesem Überwiesen -> da flag auf false stand -> Zufallszahl noch nicht im Array

            added = true; // damit die while Schleife das erste mal beendet wird und ein neuer Durchlauf mit der neuen Zufallszahl im Array gestartet werden kann

          }//Ende if

        }//Ende while

     }//Ende for i



   for(int z=0;z<zahl.length;z++){ //For Schleife geht solange wie das Array ist

     System.out.println("  "+zahl[z] + "\n"); //gibt so oft wie lang das Array ist die jeweilige Zufallszahl ab Index 0 aus

  }//Ende for z


}//Ende Methode

   public static void main (String arg[]){

     new Zufallszahlen_keine_doppelt(); //Methode Zufallszahlen_keine_doppelt() wird ausgeführt

   }

}//Ende class



Einfache Lösung: Füll ein Array mit [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] und misch es durch.

Nein das müssen wirklich Zufallszahlen sein. Das Programm soll später in einem Bereich von 1-100 laufen. ^^
 
Zuletzt bearbeitet:

MWin123

Bekanntes Mitglied
Aber eine frage hab ich noch: Was bewirkt denn dieses break;? (Hab es im oben Programm markiert (hoffe ich zumindest)) Meine abgeänderte Version funktioniert auch ohne das break :S.
Wenn die Zahl bereits im Array vorkommt, kann man abbrechen und muss nicht noch den Rest durchsuchen.
break; bricht die Schleife ab.


Zum Code:

Du übertreibst es ein bisschen mit den Kommentaren.
Du musst nun wirklich nicht jede Klammer kommentieren.

In Klassennamen solltest du keine Underlines verwenden, sondern in CamelCase schreiben. Also statt Zufallszahlen_keine_doppelt schreibst du ZufallszahlenKeineDoppelt.

Außerdem werden die Importe gar nicht benutzt, du kannst sie also entfernen.
 
Zuletzt bearbeitet:
X

Xyz1

Gast
Einfache Lösung: Füll ein Array mit [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] und misch es durch.

Ist auch die für Anfänger die am schwierigsten Lösung, möchte man eine kryptographisch sichere und starke Permutation habn, aber das wusstest du sicher. Ist auch wissenschaft für sich, wie man ein Array mischen könnte.

Mein Vorgehen:

zufällige Zahl zwischen 0 bis 9,
falls im Array (das bis n und so) schon vorhanden, mache mit Schritt 1 weiter,
einfügen ins Array,
Fertig.

Dreizeiler, imho.
 

strußi

Top Contributor
das break beendet die for-schleife, sobald eine übereinstimmung gefunden worden ist. bringt geschwindigkeit. Wenn z.B. die Zufallszahl Zahl bereits im ersten Feld liegen würde, (ja ich weiß das es nur die Referenz auf die Zahl ist) bricht er ab die for-schleife ab und läuft nicht mehr durch die restlichen Felder und vergleicht den Inhalt. du kannst dir das ja vorstellen wie es wäre, bei 100 oder mehr Zahlen
 
X

Xyz1

Gast
Das mischen ist nicht nur das Vertauschen von zwei Zahlen, wie man üblich annimmt.
Es ist wahrhaftig so, ein Dreizeiler ohne break/continue, wenn man ein Set nimmt.
 

Righteus

Mitglied
Wenn die Zahl bereits im Array vorkommt, kann man abbrechen und muss nicht noch den Rest durchsuchen.
break; bricht die Schleife ab.


Zum Code:

Du übertreibst es ein bisschen mit den Kommentaren.
Du musst nun wirklich nicht jede Klammer kommentieren.

In Klassennamen solltest du keine Underlines verwenden, sondern in CamelCase schreiben. Also statt Zufallszahlen_keine_doppelt schreibst du ZufallszahlenKeineDoppelt.

Außerdem werden die Importe gar nicht benutzt, du kannst sie also entfernen.
Gut, dann werde ich meine Klassennamen in Zukunft auch anders wählen. :)

Ah ok. Ich denke ich werde dann in Zukunft auch das ein oder andere mal break; benutzen. ^^

Die Kommentare sind ja nur für mich selber, weil ich das Programm dann vorstellen will und mich durch diese nicht durcheinanderbringen kann.


das break beendet die for-schleife, sobald eine übereinstimmung gefunden worden ist. bringt geschwindigkeit. Wenn z.B. die Zufallszahl Zahl bereits im ersten Feld liegen würde, (ja ich weiß das es nur die Referenz auf die Zahl ist) bricht er ab die for-schleife ab und läuft nicht mehr durch die restlichen Felder und vergleicht den Inhalt. du kannst dir das ja vorstellen wie es wäre, bei 100 oder mehr Zahlen
Auf Geschwindigkeit programmieren wir ja nicht. ^^
 

Neue Themen


Oben