Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Array mit Zufallswerten von 1 bis 45 ohne Wiederholung füllen
Ist das dein ganzer code?
zuffallsArray wird in der erzeugeZuffallsArray Methode instanziiert, woher soll die 2te Methode das Feld kennen? So kann das auf keinen Fall kompiliert werden.
Ist das dein ganzer code?
zuffallsArray wird in der erzeugeZuffallsArray Methode instanziiert, woher soll die 2te Methode das Feld kennen? So kann das auf keinen Fall kompiliert werden.
public static Integer[] erzeugeZufallsArray(final int size) {
List<Integer> numbers = new ArrayList<Integer>(size);
for (int i = 0; i < size; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
return numbers.toArray(new Integer[0]);
}
public static Integer[] erzeugeZufallsArray(final int size) {
List<Integer> numbers = new ArrayList<Integer>(size);
for (int i = 0; i < size; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
return numbers.toArray(new Integer[0]);
}
[Edit] Und ja in deinem Test Programm ist ein Fehler, die 3. Forschleife ist unsinnig. Eigentlich müsste eine OutOfBounds Exception fliegen. Ausserdem kannst du meines Wissens nach Integer-Objekte nicht mit == vergleichen.[/Edit]
Ich gehe davon aus, dass du 'i' unterschiedliche Zufallszahlen willst, die zwischen 0 und 46 liegen. Das wird so oft gefragt (Stichwort Lotto...) dass man die Lösung von http://www.java-forum.org/java-basi...ablen-miteinander-vergleichen.html#post612775 mal in die FAQ aufnehmen sollte. (Und warum dieses Problem im allgemeinen und bei "naiven" (d.h. nicht Landeiig-trickreichen ) Ansätzen nicht so leicht ist, steht sort im Thread etwas weiter oben)
Ich implementiere einen Integer-Array mit dem Namen test und lasse es auf die Methode erzeugeZufallsArray verweisen. Diese erzeugt ein Integer-Array (und kein void) mit Werten von 0 bis 45 ohne Wiederholung, auf dieses erzeugte Integer-Array ist dann test. Dann übergebe ich test meiner Methode richtig.
Hab eikebs Variante geringfügig angepasst:
[Edit] Und ja in deinem Test Programm ist ein Fehler, die 3. Forschleife ist unsinnig. Eigentlich müsste eine OutOfBounds Exception fliegen. Ausserdem kannst du meines Wissens nach Integer-Objekte nicht mit == vergleichen.[/Edit]
Meine Methode soll feststellen ob im getesten Array ein Wert mehrmals vorkommt:
Dazu wird jeder Wert mit jeden vergleichen. (for-Schleife 1). Es soll natürlich nicht ein Wert mit sich selbst verglichen werden aber mit jedem davor (for-Schleife 2) und jedem danach (for-Schleife 3). Hat er nichts gefunden ist der Array frei von Mehrwerten. Außerdem mit habe ich auf deine Methode den gleichen Test angewand (und hier ist meines Wissens der == Operator zulässig (und außerdem geht es mir um den Vergleich ob die Methode dann ==, equal oder sonst was ist ist mir egal)).
[Edit] Und ja in deinem Test Programm ist ein Fehler, die 3. Forschleife ist unsinnig. Eigentlich müsste eine OutOfBounds Exception fliegen. Ausserdem kannst du meines Wissens nach Integer-Objekte nicht mit == vergleichen.[/Edit]
Das ist auch eine Zuweisung. Das ganze ist ein Lotto algorithmus, erst fülle ich eine ArrayList mit den Zahlen von 1 bis 45, dann würfle ich diese Zahlen durcheinander mit shuffle und anschließend picke ich mir die vordersten n Zahlen raus.
Meine bemerkung bezüglich == Richtete sich an diese code passage:
Java:
private boolean richtig(Integer[] teufel){ //Integer Array!!!
for(int i=0; i<teufel.length; i++){ //Beim ersten schleifendurchlauf ist i=0 und j=0
for(int j=0; j<i; j++){ //Und teufel[0] ist numal == teufel[0]
if(teufel[i]==teufel[j]){ //Diese Schleife ist unnütz und falsch
return false;
}
}
for(int j=0; j<teufel.length; j++){
if(teufel[i]==teufel[j]){
return false;
}
}
}
return true;
}
wie man alle Zahlen eines Arrays miteinander Vergleicht:
Genau beim ersten Durchlauf der ersten Schleife sind i und j gleich 0 und deshalb dürfte die zweite Schleife in der ersten Runde nie starten, weil j<i false liefert. (Mir wäre neu dass die for-Schleife gleich arbeitet wie eine do-while Schleife.) Sie dürfte erst im zweiten Durchlauf der ersten Schleife starten wo sie dann teufel[1] mit teufel[0] vergleicht.
Aber deine 3. For schleife springt an und die wirft dich raus.
Wenn du dir schon mal überlegt hast was du da eigentlich machsst müsste dir das scon auffallen. Angenommen du hast einer 3er Array, also Elemente 0, 1 und 2. Du gehst das Array einmal mit der i-forschleife durch, vergleichst erst element 0 mit Element 0,1 und 2 in deiner 3. forschleife. Wenn beim vergleich 0 mit 0 noch nicht geflogen wäre, kämen beim nächsten i durchlauf die Vergleiche 1 mit 0, 1 mit 1, 2 mit 2. Merkst du jetzt was da gravierend falsch läuft? Du musst die elemente nur mit den Elementen vergleichen, die danach im array stehen. Die die davor stehen sollten schon verglichen worden sein.
Ich mache dies immer so, dass ich mir in einem boolan-Array merke, ob die Zahl an dieser Stelle bereits genommen wurde. Wenn ja, nehme ich die nächste Zufallszahl bis ich eine finde, die noch nicht hatte. Das wiederhole ich dann bis ich genügend Zahlen habe, im Beispiel 10 Zahlen (ohne Wiederholung) aus 45:
Java:
Random random = new Random();
for (int j = 0; j < 5; j++) {
boolean[] gezogen = new boolean[46];
int[] zahlen = new int[10];
for (int i = 0; i < 10; i++) {
int slot = -1;
do {
slot = random.nextInt(45) + 1;
} while (gezogen[slot]);
gezogen[slot] = true;
zahlen[i] = slot;
}
for (int zahl : zahlen)
System.out.print(zahl + " ");
System.out.println();
}
Aber deine 3. For schleife springt an und die wirft dich raus.
Wenn du dir schon mal überlegt hast was du da eigentlich machsst müsste dir das scon auffallen. Angenommen du hast einer 3er Array, also Elemente 0, 1 und 2. Du gehst das Array einmal mit der i-forschleife durch, vergleichst erst element 0 mit Element 0,1 und 2 in deiner 3. forschleife. Wenn beim vergleich 0 mit 0 noch nicht geflogen wäre, kämen beim nächsten i durchlauf die Vergleiche 1 mit 0, 1 mit 1, 2 mit 2. Merkst du jetzt was da gravierend falsch läuft? Du musst die elemente nur mit den Elementen vergleichen, die danach im array stehen. Die die davor stehen sollten schon verglichen worden sein.
Du hast dir meinen Beitrag überhaupt nicht durchgelesen, es ist komplett sinnlos das Array in nach vor und zurück durchzulaufen. Du vergleichst die selben Objekte mehrmals miteinander. Wenn dus mir nicht glaubst, mach ein println bei jedem Vergleich und lass ein int[3] durchlaufen. Weiters Vergleicht man Objekte mit equals().
Die Methoden die dir hier gepostet wurden stimmen alle, das kannst du auch einfach überprüfen indem du so ein Array ausgibst. Ich hab eikeBs Methode nur angepasst weil darin nicht Zahlen von 0-45 sondern von 0-Größe vom Array erzeugt wurden.