Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer

L

liamprog

Neues Mitglied
Hallo,
ich möchte einen 4stelligen Zufallscode zwischen 1 und 8 ausgeben, das klappt auch, allerdings tritt der Code teilweise mit doppelten Ziffern auf, was nicht passieren soll. Was kann ich da eingeben? :)

import java.util.Random;

public class Zufallscode {
/**
* Prints random numbers between 1 and 8 (inklusiv)
*/
public static void main(String[] args) {
Random random = new Random();
int zufallsZahl;

for(int i=0; i<4; i++){
zufallsZahl = 1+ random.nextInt(8);
System.out.println(zufallsZahl);
}
}
}
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Du kannst dir eine Liste mit den gewünschten Ziffern anlegen. Dann erzeugst du eine Zufallszahl zwischen 0 und Länge der Liste -1. Im Anschluss entfernst du das Listenelement mit dem gezogenen Index und und merkst es dir. Im Anschluss erzeugst du wieder eine Zufallszahl zwischen 0 und Länge der Liste - 1 usw...
 
B

Barista

Top Contributor
Letztens war hier ein Thread, bei dem es um 36 unterschiedliche (eindeutig/unique) Zahlen ging, einfach da mal nachlesen.
 
H

Hag2bard

Mitglied
Letztens war hier ein Thread, bei dem es um 36 unterschiedliche (eindeutig/unique) Zahlen ging, einfach da mal nachlesen.
 
B

berndoa

Bekanntes Mitglied
Genau an den Thread habe ich auch gedacht, war nicht das Ende vom lied das man anfangs ein Array mit den zahlen 1-36 hatte,
dann mit for schleife von index=0 bis länge-2 ging und das element an der aktuellen indexstelle mit einem random element aus den rest-array vertauschte?

war ne echt coole und simple variante, ein array "durchzumischen" :)

Dürfte auch hier funktionieren, könnte man die durchmischmethode von dort fast unverändert wiederbenutzen :)
 
Zuletzt bearbeitet:
mihe7

mihe7

Top Contributor
Richtig, im Prinzip funktioniert das wie beim Lottospielen. Man "zieht" aus einem Array mit n Elementen einfach zufällig m Zahlen und platziert die gezogenen Zahlen durch Vertauschen z. B. an den Beginn des Arrays (nacheinander, versteht sich), um sie beim nächsten Zug aus dem Spiel nehmen zu können. Gilt m >= n-2, dann hat man das komplette Array gemischt.
 
S

Steven Hachel

Bekanntes Mitglied
In dem Beitrag gab es mehrere Lösungsvorschläge. :) Einfache sowie auch komplizierte :)

Steven
 
B

berndoa

Bekanntes Mitglied
Zum Verständnis eher kompliziert, aber von seiner Effizienz her auch mit am Besten.
 
JensXF

JensXF

Mitglied
Hab die Problemstellung mit den sich wiederholenden Ziffern übernommen und als Übung (bin auch Anfänger) genutzt.
Eure Meinung zu meinem Lösungsvorschlag würde mich freuen.


Java:
import java.util.Random;

public class Main {

    public static void main(String[] args) {

        final int MIN_ZIFFER = 1;
        final int MAX_ZIFFER = 9;
        final int ANZAHL_ZIFFER = MAX_ZIFFER - MIN_ZIFFER + 1;
        final int ANZAHL_ZIFFER_CODE = 4;

        int aktuelleZahl = MIN_ZIFFER;

        int[] auswahlArray = new int[ANZAHL_ZIFFER];
        int[] codeArray = new int[ANZAHL_ZIFFER_CODE];

        for (int i = 0; i < ANZAHL_ZIFFER; i++) {
            auswahlArray[i] = aktuelleZahl;
            aktuelleZahl++;
        }

        for (int i = 0; i < ANZAHL_ZIFFER_CODE; i++) {
            boolean istZahlNeu = false;
            int neueCodeZahl = 0;
            
            while (!istZahlNeu) {
                Random zufallZahl = new Random();
                int indexNR = zufallZahl.nextInt(ANZAHL_ZIFFER);
                System.out.print(indexNR + ",");
                neueCodeZahl = auswahlArray[indexNR];
                istZahlNeu = true;
                
                for (int j = 0; j < i + 1; j++) {
                    if (codeArray[j] == neueCodeZahl) {
                        istZahlNeu = false;
                    }
                }
                
                if (istZahlNeu) {
                    codeArray[i] = neueCodeZahl;
                }
            }
        }

        System.out.println("\n");
        System.out.println("Ziffern im Auswahl Array");
        
        for (int element : auswahlArray) {
            System.out.print(element+",");
        }

        System.out.println("\n");
        System.out.println("Der generierte Code");

        for (int element : codeArray) {
            System.out.print(element);
        }
    }
}
 
mihe7

mihe7

Top Contributor
Für einen Einsteiger ist das schon sehr ordentlich. Die Schleifenbedingung in Zeile 33 geht eins zu weit, dadurch wird auch codeArray[i] überprüft. Da dieser Eintrag aber erst später gesetzt wird, brauchst Du das an der Stelle nicht abzuprüfen. Kurz: j < i reicht.

Ansonsten könnte man bemängeln, dass Variablen immer so spät wie möglich und so früh als nötig deklariert werden sollten.

Wir können das ja mal kurz durchgehen:

Zeilen 7 bis 10: Konstanten zu Beginn definiert: sehr gut!

Zeile 12: kann unmittelbar vor die for-Schleife. aktuelleZahl wird ausschließlich in der for-Schleife benötigt. Theoretisch wäre aktuelleZahl (wie i) eine lokale Variable der for-Schleife. Die könnte man sogar so schreiben, dann wird der Code aber hässlich:
Java:
for (int i = 0, aktuelleZahl = MIN_ZIFFER; i < ANZAHL_ZIFFER; i++, aktuelleZahl++) {
    auswahlArray[i] = aktuelleZahl;
}
Hier würde ich aus Gründen der Lesbarkeit auch zu Deiner Variante greifen, aber aktuelleZahl eben unmittelbar vor der for-Schleife deklarieren.

Zeile 15: vor die nächste for-Schleife schieben. codeArray wird erst später benötigt.

Zeile 24: die kann ganz raus, denn bei neueCodeZahl handelt es sich um eine Variable, die lokal innerhalb der while-Schleife verwendet wird. Dazu muss man Zeile 30 lediglich schreiben als
Java:
int neueCodeZahl = auswahlArray[indexNR];

Zeile 27: vor die while-Schleife ziehen, da man nicht in jeder Wiederholung einen neuen Zufallsgenerator braucht.

Das wars eigentlich auch schon, was die Variablen betrifft.

Dass die Ausgaben mit einem Komma enden ist nicht schön, das könntest Du als Übung ändern. Wenn Du sattelfest bist, kannst Du den Code auch auf Methoden aufteilen.

Und bitte nicht von der Fülle des Texts verunsichern lassen. Ich betreibe hier z. T. Jammern auf hohem Niveau. Dein Code ist echt ok.
 
B

Barista

Top Contributor
@JensXF

Es wäre besser, die Variable random ausserhalb der Schleife anzulegen.

1. kostet das Anlegen des Random-Objekts einiges an Laufzeit.

2. Benutzt Random die Systemzeit als seed, also wird möglicherweise immer die selbe Zahl geliefert, weil das Programm schneller als der Zeitwechsel sein kann.
 
JensXF

JensXF

Mitglied
@mihe7 @Barista

Vielen Dank für die Mühe - gar nicht mit so detaillierten Kommentaren gerechnet.
Die Variablen habe ich wie empfohlen an die entsprechenden Plätze verschoben.

Random zufallZahl steht jetzt vor der for-Schleife und wird nur einmal deklariert.

Die Sache mit Kommata setzen habe ich wie folgt gelöst:
Java:
System.out.println("Ziffern im Auswahl Array");

        int kommaCounter = 0;

        for (int element : auswahlArray) {
            System.out.print(element);
            if (kommaCounter < auswahlArray.length - 1) {
                System.out.print(",");
                kommaCounter++;
            }
        }

Den Code auf Methoden aufzuteilen werde ich sicher auch noch versuchen.
 
mihe7

mihe7

Top Contributor
@mihe7 @Barista

Vielen Dank für die Mühe - gar nicht mit so detaillierten Kommentaren gerechnet.
Die Variablen habe ich wie empfohlen an die entsprechenden Plätze verschoben.

Random zufallZahl steht jetzt vor der for-Schleife und wird nur einmal deklariert.

Die Sache mit Kommata setzen habe ich wie folgt gelöst:
Java:
System.out.println("Ziffern im Auswahl Array");

        int kommaCounter = 0;

        for (int element : auswahlArray) {
            System.out.print(element);
            if (kommaCounter < auswahlArray.length - 1) {
                System.out.print(",");
                kommaCounter++;
            }
        }

Den Code auf Methoden aufzuteilen werde ich sicher auch noch versuchen.
Wenn Du beim Aufteilen auf Methoden aufmerksam bist, siehst Du ggf. auch einen Zusammenhang mit den Positionen der Variablen im Code :)

Was die Sache mit dem Komma betrifft, so ist die recht interessant. Dein Ansatz ist naheliegend (wobei man eine normale for-Schleife verwenden könnte, da man ja sowieso eine Laufvariable hat), hat allerdings einen Nachteil: man muss wissen, wie viele Elemente es insgesamt sind. Hat man eine Struktur, wo das nicht bekannt ist, funktioniert er nicht mehr. Interessant ist nun, dass das auch anders funktioniert. Dazu schaut man sich nicht an, was nach einem Element kommt, sondern was vor einem Element steht. Vor jedem Element steht ein Komma, nur vor dem ersten nicht. Das erste Element lässt sich immer bestimmen.

Dazu braucht man noch nicht einmal eine Laufvariable, hier reicht ein boolean:
Java:
boolean komma = false;
for (int element : auswahlArray) {
    if (komma) {
        System.out.print(",");
    }
    System.out.print(element);
    komma = true;
}

Weiß man, dass das Array mindestens ein Element besitzt, kann man mit einer Laufvariablen schreiben:
Java:
System.out.print(auswahlArray[0]); // erstes Element
for (int i = 1; i < auswahlArray.length; i++) { // Rest des Arrays
    System.out.print("," + auswahlArray[i]);
}
 
JensXF

JensXF

Mitglied
. . . hat allerdings einen Nachteil: man muss wissen, wie viele Elemente es insgesamt sind. Hat man eine Struktur, wo das nicht bekannt ist, funktioniert er nicht mehr.
Aber hat nicht jedes Array eine bestimmte Größe?
Also ich meine zum Zeitpunkt des Aufrufes der Methode array.length . . . egal ob kein Element enthalten ist (dann sollte nichts passieren),
10 oder 1000.

Sorry für die Nachfragen, aber ich weiß gerade nicht warum die Größe nicht bekannt sein sollte. Bei array.length wird doch das entsprechende Array gefragt: "Ey Array, sag mal, wie groß bist du eigendlich?" (Keine Ahnung ob das der genaue Wortlaut ist.:))
 
JensXF

JensXF

Mitglied
Hier dann wie versprochen mein Versuch den Code als eigene Klasse mit Methoden zu schreiben.
Ich lasse die Methode befuelleArray() direkt vom Konstruktor ausführen, hätte ich sicher dann direkt mit reinschreiben können, oder?

Main
Java:
public class Main {

    public static void main(String[] args) {
        
        CodeGenerator neuerCode = new CodeGenerator(0, 9, 4);
        neuerCode.generiereCode();
        neuerCode.ausgabeCode();
    }
}

Klasse CodeGenerator
Java:
import java.util.Random;

public class CodeGenerator {

    private int minZiffer;
    private int maxZiffer;
    private int anzahlZiffer;
    private int anzahlZifferCode;
    private int[] auswahlArray;
    private int[] codeArray;

    public CodeGenerator(int minZiffer, int maxZiffer, int anzahlZifferCode) {
        this.minZiffer = minZiffer;
        this.maxZiffer = maxZiffer;
        this.anzahlZifferCode = anzahlZifferCode;

        this.anzahlZiffer = this.maxZiffer - this.minZiffer + 1;

        if (this.anzahlZiffer < this.anzahlZifferCode) {
            System.out.println("Die Anzahl der zur Verfügung stehenden Ziffern reicht nicht aus \n"
                    + "um einen Code dieser Größe mit sich nicht wiederholenden Ziffern zu generieren.");
        } else {
            this.auswahlArray = new int[this.anzahlZiffer];

            befuelleArray();
        }
    }

    private void befuelleArray() {
        int aktuelleZahl = this.minZiffer;

        for (int i = 0; i < this.anzahlZiffer; i++) {
            this.auswahlArray[i] = aktuelleZahl;
            aktuelleZahl++;
        }
    }

    public void generiereCode() {
        this.codeArray = new int[this.anzahlZifferCode];
        Random zufallZahl = new Random();

        for (int i = 0; i < this.anzahlZifferCode; i++) {
            boolean istZahlNeu = false;

            while (!istZahlNeu) {
                int indexNR = zufallZahl.nextInt(this.anzahlZiffer);
                int neueCodeZahl = this.auswahlArray[indexNR];
                istZahlNeu = true;

                for (int j = 0; j < i; j++) {
                    if (this.codeArray[j] == neueCodeZahl) {
                        istZahlNeu = false;
                    }
                }

                if (istZahlNeu) {
                    this.codeArray[i] = neueCodeZahl;
                }
            }
        }
    }

    public void ausgabeCode() {
        System.out.println("Ziffern im Auswahl Array");

        boolean komma = false;

        for (int element : this.auswahlArray) {

            if (komma) {
                System.out.print(",");
            }
            System.out.print(element);
            komma = true;
        }

        System.out.println("\n");
        System.out.println("Der generierte Code");

        for (int element : this.codeArray) {
            System.out.print(element);
        }
    }

    public int getMinZiffer() {
        return minZiffer;
    }

    public void setMinZiffer(int minZiffer) {
        this.minZiffer = minZiffer;
    }

    public int getMaxZiffer() {
        return maxZiffer;
    }

    public void setMaxZiffer(int maxZiffer) {
        this.maxZiffer = maxZiffer;
    }

    public int getAnzahlZifferCode() {
        return anzahlZifferCode;
    }

    public void setAnzahlZifferCode(int anzahlZifferCode) {
        this.anzahlZifferCode = anzahlZifferCode;
    }

    public int getAnzahlZiffer() {
        return anzahlZiffer;
    }

    public int[] getAuswahlArray() {
        return auswahlArray;
    }

    public int[] getCodeArray() {
        return codeArray;
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Char Array an zufälligen stellen mit einem "x" füllen. Java Basics - Anfänger-Themen 4
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
A Ein Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 4
B Methoden Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 4
A Wie kann man einen zufälligen String aus einem StringArray auswählen? Java Basics - Anfänger-Themen 6
A Ausgabe eines zufälligen Arrays Java Basics - Anfänger-Themen 2
N Initialisieren einer zufälligen Matrix Java Basics - Anfänger-Themen 12
Antoras Einen zufälligen String auswählen Java Basics - Anfänger-Themen 5
M Raster mit zufälligen Farben Java Basics - Anfänger-Themen 4
N Matrix mit werte füllen, an zufälligen Positionen Java Basics - Anfänger-Themen 2
halla zufälligen Buchstabe aus dem Alfabet auswählen Java Basics - Anfänger-Themen 5
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
Sinan Arrays auflisten ohne Wiederholung Java Basics - Anfänger-Themen 28
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
S Teilen ohne Rest Java Basics - Anfänger-Themen 15
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
P Methode trim() ohne StringBuilder Java Basics - Anfänger-Themen 1
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
S Klassenmethode ohne static Java Basics - Anfänger-Themen 2
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
M Bubblesort ohne Array Java Basics - Anfänger-Themen 30
J Array vertauschen ohne ein neues anzulegen?! Java Basics - Anfänger-Themen 10
F Hilfe - Wahrheitswert überprüfen ohne If Java Basics - Anfänger-Themen 2
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
C Teilbarkeit ohne "if" Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
R for schleife ohne klammer Java Basics - Anfänger-Themen 14
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
B Potenzrechnung mit WindowBuilder ohne math.pow() Java Basics - Anfänger-Themen 1
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
D .txt überschreiben mit BufferedWriter ohne reset Java Basics - Anfänger-Themen 6
H Cäsar chiffrierung ohne if-Anweisung Java Basics - Anfänger-Themen 5
I Input/Output System.out Ausgabe aktualisieren, ohne Konsole vollzuspamen Java Basics - Anfänger-Themen 2
B Potenzen ohne Math.pow Java Basics - Anfänger-Themen 4
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
M Liste ohne Duplikate Java Basics - Anfänger-Themen 8
S Rekursiver InsertionSort ohne Schleife Java Basics - Anfänger-Themen 7
4 Median ohne Array Rausbekommen Java Basics - Anfänger-Themen 8
L Auf Methoden einer Subklasse zugreifen ohne Typecast ? Java Basics - Anfänger-Themen 6
5 for-Schleife ohne 3 Angaben Java Basics - Anfänger-Themen 2
D Sortiertes Array mischen ohne Duplikat Java Basics - Anfänger-Themen 5
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
P JavaFX ohne FXMLLoader Java Basics - Anfänger-Themen 3
J Erstellen einer Datei ohne path Java Basics - Anfänger-Themen 1
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
P Kann ich Java - Programme auch ohne Editor öffnen? Java Basics - Anfänger-Themen 70
E Methoden Objekte in Methode aufrufen ohne getter und setter? Java Basics - Anfänger-Themen 1
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
C Klassen JTable wird ohne Header aufgebaut Java Basics - Anfänger-Themen 6
M Abbrechen Methode ohne return Java Basics - Anfänger-Themen 3
R Gleitkommazahlen ohne führende Null Java Basics - Anfänger-Themen 10
B Farbverlauf erstellen ohne Javafx, AWT usw.? Java Basics - Anfänger-Themen 34
4a61766120617274697374 AES 256 ohne policies Java Basics - Anfänger-Themen 1
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
snipesss Linie zeichnen ohne extra Klasse? Java Basics - Anfänger-Themen 3
N Eclipse Source importieren ohne Link Java Basics - Anfänger-Themen 3
Hijo2006 Array/Liste ohne Obergrenze Java Basics - Anfänger-Themen 38
B Zufallszahlen ohne Wiederholung Java Basics - Anfänger-Themen 10
E Methoden Auf Methoden einer Klasse zugreifen, ohne ein Objekt zu erstellen Java Basics - Anfänger-Themen 2
N Auf TextFeld aus anderer Klasse zugreifen ohne es zu übergeben Java Basics - Anfänger-Themen 3
B .bat - Datei starten ohne Konsolenfenster zu sehen Java Basics - Anfänger-Themen 6
L Java 1.6 ohne sicherheitsmedung nutzen Java Basics - Anfänger-Themen 4
K URL ohne http:// Java Basics - Anfänger-Themen 8
F For Schleife ohne Zähler Java Basics - Anfänger-Themen 3
H Nicht Static Funktion ohne Objekt aufrufen? Java Basics - Anfänger-Themen 6
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
F StringBuilder: Zeilenumbruch nach x Zeichen ohne Worttrennung Java Basics - Anfänger-Themen 1
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 5
K Loop ohne Schleifen Java Basics - Anfänger-Themen 2
K Element in ArrayList löschen ohne Index zu verschieben Java Basics - Anfänger-Themen 2
K Methoden Programm ohne Main Methode starten Java Basics - Anfänger-Themen 2
A boolean Methode ohne If und else Java Basics - Anfänger-Themen 1
B Rechnung ohne Klammer liefert komisches Ergebniss Java Basics - Anfänger-Themen 3
J Keyboard Event auch ohne Fokus mitbekommen Java Basics - Anfänger-Themen 2
B Erste Schritte Way of life ohne import - Habe Beispiel, macht Unfug Java Basics - Anfänger-Themen 21

Ähnliche Java Themen


Oben