//zufällige Anzahl von Gegenstaenden erzeugen.
public String createThings()
{
Random zufall = new Random();
String things = "Gegenstaende: ";
int i = zufall.nextInt(box.size());
if(i == 0){things = things + " none";}
else{
for (int x =1 ; x<box.size();x++)
{
Gegenstaende y = (Gegenstaende) box.get(x);
things = things + y.getName() + " " + y.getGewicht() +"g; " ;
}
}
return things;
}
// zufall von createThings() prüfen.
public void printListe()
{
System.out.println(createThings());
}
Ich erzeuge sagen wir drei Instanzen der Klasse Gegenstaende die werden in der obenstehenden Klasse an das ArrayList Objekt box übergeben. Das klappt auch.
Wenn die methode createThings() // siehe oben
aufgerufen wird sollte sie aus box eine zufällige anzahl von Gegenständen ausgeben, das überprüf ich mit der 2. methode
printListe()
es kommt immer das selbe nur wenn ich die Klasse von den Methoden neu instanziere kommt etwas unterschiedliches. also nur beim ersten mal
rufe ich die Methode printListe hinter einander mehrfach auf bleibt es immer das selbe.
Ich dachte eine Methode und ihre variablen werden nach ihrem Aufruf gelöscht, also müsste Random doch jedes mal neu erzeugt werden wenn ich die methode createThings aufrufe?
for (int x =1 ; x<box.size();x++)
{
Gegenstaende y = (Gegenstaende) box.get(x);
things = things + y.getName() + " " + y.getGewicht() +"g; " ;
}
Hi, ich könnte mir vorstellen, das dort der Fehler liegt.
Wenn also die Zufallszahl != 0 ist, dann gibst du in der for-Schleife alle Werte aus, da sie ja von 1 bis box.size()-1 läuft. Das sind dann immer die gleichen Werte, weil die Wahrscheinlichkeit, das die Zufallszahl == 0 ist sehr gering ist. Und warum nimmst du den Index 0 nicht dazu? Das ist der erste Index in einer ArrayList!!!
Unser Lehrer hat uns vor kurzem folgendes erklärt:
Wirklichen Zufall gibt es ja logischerweise im Computer nicht. Also wird meistens irgendwie die Zahl aus der Systemzeit errechnet.
Wenn du jetzt die Methode createThings() dierekt nacheinander öffnest, dann kann es sein, dass sich die Systemzeit nicht geändert hat. Deshalb sollte man das Random-Objekt immer als Datenfeld speichern. Dadurch wiederholen sich die Werte nicht so leicht. Im Konstruktor kann man dann dieses Objekt anlegen.
Kennst du den Unterschied zwischen lokaler Variabel und Datenfeld?
lokale Variable: Wird in einer Methode deklariert und ist nur in dieser gültig.
Datenfeld: Wird am Anfang der Klasse deklariert und ist im ganzen Objekt gültig.
Und Random sollte man im Datenfeld ablegen
Was ist ein seed? Ich habe mal kurz in die Doku reingeschaut, hat mich aber auch nicht so viel weitergebracht. Wird dann aus dem Parameter die Zufallszahl bestimmt? Wenn ja, dann macht es ja eigentlich nicht so viel Sinn, wenn man ja die Systemzeit nehmen kann hat man ja immer einen anderen Wert (insofern man die Objekte nicht zu schnell hintereinander aufruft).
mich auch nicht, die doku ist wie oft sehr knapp mit erklärung.
Scheint sowas wie eine interne Zahl zu sein die man festlegen muss, einfach Random noch beim instanzieren eine Zahl übergeben.