Liste mit zufälligen zahlen füllen

java3690

Mitglied
Hi leute,
ich habe diese Aufgabe zu erledigen.
Ich habe meinen Ansatz hier hochgeladen und habe realisiert, das ich ziemlich viel falsch gemacht habe, deswegen mache ich einen neuen Post, wo ich um Hilfe bitte,
Es wäre sehr nett, wenn jemand mir helfen könnte.
Hätte jemand eine Idee wie ich das programmieren kann.
hier die Fragestellung:
Füge in eine Liste die Zahlen von 1 bis 50 in zufälliger Reihenfolge ein. Gehe durch die Liste und gib die Summe aller Zahlen der Liste auf der Konsole
Danke im Voraus
 
Sooo falsch war Dein Ansatz nicht. Wenn ich es gerade richtig im Kopf habe, hast Du nur den falschen Datentyp gewählt (Set statt List). Es ist halt nicht besonders effizient, so lange Zufallszahlen zu generieren, bis man eine noch nicht verwendete findet, aber es wird so funktionieren.
 
@mihe7 hat das Wichtigste schon geschrieben und auch der alternative Ansatz wurde in deinem anderen Thema bereits erwähnt: Fülle die Liste einfach der Reihe nach und mische sie anschließend z.B. mit Collections.shuffle().

Vermutlich ist in der Aufgabe allerdings tatsächlich deine bereits (fast) korrekte Lösung gesucht. Also bleib dran 😉
 
Ich sehe seinen Ansatz wieder nicht... wieder ein Browser Problem?
Nein, der ist in dem anderen Thread vom TE:
 
ich habe jetzt eure Tipps genutzt und einen anderen Ansatz gemacht, hätte wer eine Idee wie ich dann durch die List gehen kann und alle Elemente addieren könnte. Das Ergebnis ist natürlich klar aber ich soll auf dem Weg auf das Ergebnis kommen
hier mein Ansatz bis jetzt:


import java.util.ArrayList;
import java.util.Random;

public class Zahlenbis50 {
public static void main(String[] args) {
int size = 50;

ArrayList<Integer> list = new ArrayList<Integer>(size);
for(int i = 1; i <= size; i++) {
list.add(i);
}

Random rand = new Random();
while(list.size() > 0) {
int index = rand.nextInt(list.size());
System.out.println("Selected: "+list.remove(index));
}
}
}

Danke im Voraus
Sooo falsch war Dein Ansatz nicht. Wenn ich es gerade richtig im Kopf habe, hast Du nur den falschen Datentyp gewählt (Set statt List). Es ist halt nicht besonders effizient, so lange Zufallszahlen zu generieren, bis man eine noch nicht verwendete findet, aber es wird so funktionieren
 
Das Ergebnis ist natürlich klar aber ich soll auf dem Weg auf das Ergebnis kommen
hier mein Ansatz bis jetzt:
Naja, Du brauchst eine Variable für die Summe, die anfangs natürlich 0 ist. Den index hast Du ja, also kannst Du mit list.get(index) das betreffende Element aus der Liste abrufen und auf die Summe addieren. Nach der Schleife gibst Du die Summe aus.

Übrigens: ein sehr guter Ansatz, den Du da gewählt hast.
 
ich hab das jz so gemacht allerdings kommen halt nur die Zahlen aber nicht die Summer aller Zahlen.
Ich erkenne meinen Fehler irgendwie gar nicht.
Trotzdem danke dir man
i

mport java.util.ArrayList;
import java.util.Random;

public class Test {
public static void main(String[] args) {
int size = 10;

ArrayList<Integer> list = new ArrayList<Integer>(size);
for(int i = 1; i <= size; i++) {
list.add(i);
}

Random rand = new Random();
while(list.size() > 0) {
int index = rand.nextInt(list.size());
System.out.println("Selected: "+list.remove(index));
} int summe = 0;
while(list.size() > 0) {

int index = list.size() - 1;

summe += list.remove(index);

}
}
}
 
In der ersten Schleife füllst du die Liste list.
In der zweiten Schleife löscht du u.a. alle Werte...
In der dritten Schleife gehst du dann nur noch über die leere Liste....
 
Bitte immer in code-Tags posten.
Java:
import java.util.ArrayList;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        int size = 10;

        ArrayList<Integer> list = new ArrayList<Integer>(size);
        for(int i = 1; i <= size; i++) {
            list.add(i);
        }

        Random rand = new Random();
        while(list.size() > 0) {
            int index = rand.nextInt(list.size());
            System.out.println("Selected: "+list.remove(index));
        } 
        int summe = 0;

        while(list.size() > 0) {
            int index = list.size() - 1;
            summe += list.remove(index);
        }
    }
}
 
Es gibt da tatsächlich zwei Ansätze (um annähernd das richtige Ergebnis zu erhalten):
Java:
    public static void main(String[] args) {
        Random r = new Random();
        ArrayList<Integer> list = new ArrayList<Integer>(50);
        for (int i = 1; i <= 50; i++) {
            list.add(r.nextInt(list.size() + 1), i);
        }

        // This is faster
        double sum = 0;
        for (int i = 0; i < 25; i++) {
            sum += list.get(r.nextInt(list.size())) * 2.0;
        }

        // This is exact
        long proof = 0;
        for (int i = 0; i < list.size(); i++) {
            proof += list.get(i);
        }

        System.out.println(Math.round(sum));
        System.out.println(proof);
    }
 
Es gibt da tatsächlich zwei Ansätze (um annähernd das richtige Ergebnis zu erhalten):
Java:
    public static void main(String[] args) {
        Random r = new Random();
        ArrayList<Integer> list = new ArrayList<Integer>(50);
        for (int i = 1; i <= 50; i++) {
            list.add(r.nextInt(list.size() + 1), i);
        }

        // This is faster
        double sum = 0;
        for (int i = 0; i < 25; i++) {
            sum += list.get(r.nextInt(list.size())) * 2.0;
        }

        // This is exact
        long proof = 0;
        for (int i = 0; i < list.size(); i++) {
            proof += list.get(i);
        }

        System.out.println(Math.round(sum));
        System.out.println(proof);
    }
danke dir man
wie könnte ich das denn so machen, dass die Zahlen auch zu sehen sind und nicht nur die Summe aller zahlen?
das würde mir enorm helfen
 
Du kannst auch Summen berechnen. Nur eben ist das Vorgehen falsch:
Du füllst Wasser in ein Glas.
Du schüttest das Glas aus
Du trinkst aus dem Glas -> Warum kriege ich meinen Durst nicht gestillt?

Wenn Du willst, das am Ende das Glas leer ist (Schleife 2) und du aber das Wasser getrunken hast (Schleife 3) dann mache es doch zusammen:
Schütte das Wasser aus dem Glas in Deinen Mund und schlucke dabei... ==> Dein Durst wird gestillt. Super!

Also bei Dir: Elemente nicht nur aus der Liste nehmen und Ausgaben sondern auch für die Summenbildung verwenden.
 
Du kannst auch Summen berechnen. Nur eben ist das Vorgehen falsch:
Du füllst Wasser in ein Glas.
Du schüttest das Glas aus
Du trinkst aus dem Glas -> Warum kriege ich meinen Durst nicht gestillt?

Wenn Du willst, das am Ende das Glas leer ist (Schleife 2) und du aber das Wasser getrunken hast (Schleife 3) dann mache es doch zusammen:
Schütte das Wasser aus dem Glas in Deinen Mund und schlucke dabei... ==> Dein Durst wird gestillt. Super!

Also bei Dir: Elemente nicht nur aus der Liste nehmen und Ausgaben sondern auch für die Summenbildung verwenden.
wenn ich ehrlich bin weiß ich nich wie ich beide schritte gleichzeitig mache sag ich mal also die Elemente addieren und gleichzeitig rausholen aus der liste
 
wärst du so korrekt und würdest mir schnell erklären warum hier die zahlen zwar zufällig addiert werden und trotzdem sich nicht wiederholen, weil ich das anhand deines Ansatzes nicht komplett nachvollziehen liegt aber daran dass ich nicht viel Ahnung von dem ganzen habe
Java:
public static void main(String[] args) { 
    Random r = new Random(); 
    ArrayList<Integer> list = new ArrayList<Integer>(50); 
    for (int i = 1; i <= 50; i++) {
        list.add(r.nextInt(list.size() + 1), i);
    }
 
Zuletzt bearbeitet von einem Moderator:
wenn ich ehrlich bin weiß ich nich wie ich beide schritte gleichzeitig mache sag ich mal also die Elemente addieren und gleichzeitig rausholen aus der liste
Schauen wir uns den Code doch einfach noch einmal im Detail an:
[CODE lang="java" highlight="15,16,21,22"]import java.util.ArrayList;
import java.util.Random;

public class Test {
public static void main(String[] args) {
int size = 10;

ArrayList<Integer> list = new ArrayList<Integer>(size);
for(int i = 1; i <= size; i++) {
list.add(i);
}

Random rand = new Random();
while(list.size() > 0) {
int index = rand.nextInt(list.size());
System.out.println("Selected: "+list.remove(index));
}
int summe = 0;

while(list.size() > 0) {
int index = list.size() - 1;
summe += list.remove(index);
}
}
}[/CODE]

Du hast da zwei Aktivitäten, die wir nun zusammen legen wollen. Die while Schleife ist identisch, die bleibt also.

Dann besorgst Du dir einen Index und dann kommen zwei Dinge in einer Zeile:
a) Du holst die Zahl an der Stelle aus der Liste und löscht diese
b) Du gibst die Zahl aus.
Das können wir aufteilen in zwei Zeilen - also erst das list.remove und das Ergebnis wird gespeichert in einer lokalen Variable, dann die lokale Variable ausgeben.

Nun brauchen wir aber noch etwas: Die zahl aus dem Element, soll noch zu summe addiert werden. Das kommt also auch noch dazu.

So hast Du dann in einer Schleife Zahl für Zahl gezogen bis keine mehr da ist und die Zahlen aufaddiert.
 
wärst du so korrekt und würdest mir schnell erklären warum hier die zahlen zwar zufällig addiert werden und trotzdem sich nicht wiederholen, weil ich das anhand deines Ansatzes nicht komplett nachvollziehen liegt aber daran dass ich nicht viel Ahnung von dem ganzen habe
Was ist denn eigentlich das Ziel? Oder die Ziele... Ich blicke da langsam nicht mehr durch.

Versuche es in eigenen Worten vollständig, aber so einfach wie möglich, zu beschreiben.
 
Hier noch ein Ultimativer Tipp...
Stelle dir ein Skatspiel vor. Die Karten wurden bereits verteilt und der Spieler möchte seine Karten in die Hand nehmen. Er nimmt also eine Karte nach der anderen auf und wählt jeweils eine zufällige "Einsteck-Position" aus (damit die anderen Spieler die Stärke der Hand nicht erkennen können). Wenn er das für alle 10 Karten macht, hält er die Karten dann alle unsortiert in der Hand.
 
wärst du so korrekt und würdest mir schnell erklären warum hier die zahlen zwar zufällig addiert werden und trotzdem sich nicht wiederholen, weil ich das anhand deines Ansatzes nicht komplett nachvollziehen liegt aber daran dass ich nicht viel Ahnung von dem ganzen habe
Ich vermute, dass Du Probleme hast, die erste Schleife zu verstehen:
Die Schleife läuft über die Zahlen, die eingefügt werden sollen.
list.add(r.nextInt(list.size() + 1), i);
Dies fügt i (den Schleifenzähler) in die Liste ein. Das aber an eine Position, die zufällig ausgewählt wird. Siehe dazu ggf. die Dokumentation der Methode add:

Die Position, an der eingefügt werden soll, kann nur zwischen 0 und size() der Liste sein. Da die obere Grenze nicht inclusive ist bei nextInt, muss zu der Grenze noch 1 addiert werden.
 
Schauen wir uns den Code doch einfach noch einmal im Detail an:
[CODE lang="java" highlight="15,16,21,22"]import java.util.ArrayList;
import java.util.Random;

public class Test {
public static void main(String[] args) {
int size = 10;

ArrayList<Integer> list = new ArrayList<Integer>(size);
for(int i = 1; i <= size; i++) {
list.add(i);
}

Random rand = new Random();
while(list.size() > 0) {
int index = rand.nextInt(list.size());
System.out.println("Selected: "+list.remove(index));
}
int summe = 0;

while(list.size() > 0) {
int index = list.size() - 1;
summe += list.remove(index);
}
}
}[/CODE]

Du hast da zwei Aktivitäten, die wir nun zusammen legen wollen. Die while Schleife ist identisch, die bleibt also.

Dann besorgst Du dir einen Index und dann kommen zwei Dinge in einer Zeile:
a) Du holst die Zahl an der Stelle aus der Liste und löscht diese
b) Du gibst die Zahl aus.
Das können wir aufteilen in zwei Zeilen - also erst das list.remove und das Ergebnis wird gespeichert in einer lokalen Variable, dann die lokale Variable ausgeben.

Nun brauchen wir aber noch etwas: Die zahl aus dem Element, soll noch zu summe addiert werden. Das kommt also auch noch dazu.

So hast Du dann in einer Schleife Zahl für Zahl gezogen bis keine mehr da ist und die Zahlen aufaddiert.
danke dir das macht jetzt mehr sinn ich guck jetzt ob ich das als code eingeben kann oder ob ich jetzt wieder in ein paar stunden hier bin
 
Schauen wir uns den Code doch einfach noch einmal im Detail an:
[CODE lang="java" highlight="15,16,21,22"]import java.util.ArrayList;
import java.util.Random;

public class Test {
public static void main(String[] args) {
int size = 10;

ArrayList<Integer> list = new ArrayList<Integer>(size);
for(int i = 1; i <= size; i++) {
list.add(i);
}

Random rand = new Random();
while(list.size() > 0) {
int index = rand.nextInt(list.size());
System.out.println("Selected: "+list.remove(index));
}
int summe = 0;

while(list.size() > 0) {
int index = list.size() - 1;
summe += list.remove(index);
}
}
}[/CODE]

Du hast da zwei Aktivitäten, die wir nun zusammen legen wollen. Die while Schleife ist identisch, die bleibt also.

Dann besorgst Du dir einen Index und dann kommen zwei Dinge in einer Zeile:
a) Du holst die Zahl an der Stelle aus der Liste und löscht diese
b) Du gibst die Zahl aus.
Das können wir aufteilen in zwei Zeilen - also erst das list.remove und das Ergebnis wird gespeichert in einer lokalen Variable, dann die lokale Variable ausgeben.

Nun brauchen wir aber noch etwas: Die zahl aus dem Element, soll noch zu summe addiert werden. Das kommt also auch noch dazu.

So hast Du dann in einer Schleife Zahl für Zahl gezogen bis keine mehr da ist und die Zahlen aufaddiert.
danke dir das macht jetzt mehr sinn ich guck jetzt ob ich das als code eingeben kann oder ob ich jetzt wieder in ein paar stunden hier bin
 
Ich vermute, dass Du Probleme hast, die erste Schleife zu verstehen:
Die Schleife läuft über die Zahlen, die eingefügt werden sollen.
list.add(r.nextInt(list.size() + 1), i);
Dies fügt i (den Schleifenzähler) in die Liste ein. Das aber an eine Position, die zufällig ausgewählt wird. Siehe dazu ggf. die Dokumentation der Methode add:

Die Position, an der eingefügt werden soll, kann nur zwischen 0 und size() der Liste sein. Da die obere Grenze nicht inclusive ist bei nextInt, muss zu der Grenze noch 1 addiert werden.
also könte man sagen, dass die zahlen von 1 bis 50 der rheinfolge nach eingefügt werden, allerdings ist die Position wo die hinkommen zufällig dann ausgewählt und deswegen widerholen sich die zahlen nicht ?
 
Hier noch ein Ultimativer Tipp...
Stelle dir ein Skatspiel vor. Die Karten wurden bereits verteilt und der Spieler möchte seine Karten in die Hand nehmen. Er nimmt also eine Karte nach der anderen auf und wählt jeweils eine zufällige "Einsteck-Position" aus (damit die anderen Spieler die Stärke der Hand nicht erkennen können). Wenn er das für alle 10 Karten macht, hält er die Karten dann alle unsortiert in der Hand.
ich muss ehrlich sagen, das macht für mich auf jeden fall mehr sinn und ich glaube ich habe es jetzt verstanden Danke dir man
 
also könte man sagen, dass die zahlen von 1 bis 50 der rheinfolge nach eingefügt werden, allerdings ist die Position wo die hinkommen zufällig dann ausgewählt und deswegen widerholen sich die zahlen nicht ?
Ja, fast. Die Zahlen können sich ja gar nicht wiederholen, weil du ja die Zahlen von 1 - 50 der Reihe nach (an zufälliger Position) einfügst, also jede Zahl nur genau einmal.

Würdest du eine Zahl mehrfach einfügen, dann wäre sie auch mehrfach in der Liste.
 

Neue Themen


Zurück
Oben