Java Greenfoot Zufallszahlen neu generieren

Zerstoerer

Lieutenant
Registriert
Okt. 2010
Beiträge
685
Hallo zusammen,

gerade bin ich dabei ein kleines Java Programm mit Greenfoot zu entwickeln. Dabei brauche ich allerdings immer wieder eine neue Zufallszahl. Bisher verwendete ich die Methode:
int zufallgegner = Greenfoot.getRandomNumber(885);
um eine Zufallszahl zu bekommen. Allerdings ändert sich die Zufallszahl nie und bleibt immer gleich.
Kann mir einer sagen, wie ich immer eine neue Zahl bekomme?

Wäre dankbar um ein paar Ratschläge.
 
Wenn du weißt, dass zwischen zwei Zufallszahlen immer ein gewisser zeitlicher Abstand besteht, wäre es möglich, mit den kleinsten Einheiten der Systemzeit zu arbeiten. Werden allerdings mehrere Zufallszahlen unmittelbar hintereinander bzw. in einem zu engen zeitlichen Rahmen benötigt kommen nicht mehr ganz so "zufällige" Ergebnisse raus, weshalb man das dann vergessen kann.

Leider kann ich dir nicht sagen, was bei Java die kleinste Zeiteinheit ist, Millisekunden sollten wohl noch dabei sein und würden es je nach dem auch tun, ob es noch kleiner geht weiß ich nicht.
 
hier eine Methode

public static void lieferZufallsZahl()
{
// Zufallszahl zwischen 0.1 & 1.0 erzeugen
double dezimalZahl = Math.random();

// Wert in den Bereich 0 bis n strecken
int ganzZahl = (int)Math.round( dezimalZahl * n );

return ganzZahl;
}
 
Zuletzt bearbeitet:
@crykiller: Geht auch einfacher:
Code:
final Random rand = new Random();

public int getRandomNumber(final int limit){
   return rand.nextInt(limit);
}

@ManOki: Ich glaube, er möchte hierbei aber auf Greenfoot setzen und nicht direkt die Java API verwenden.

Ich habe zwar noch nie was mit Greenfoot gemacht, gerade aber mal in den Source und die Doku geschaut. Die Methode ist schon die richtige, intern wird dabei

Code:
return randomGenerator.nextInt(limit);

aufgerufen, die Zahl sollte sich also immer unterscheiden.

Bist du sicher, dass du immer die selbe bekommst?
 
@AlrikvomFluss Sorry hast recht :-)

@TE kannst du uns mal nen Stück von deinem Code zeigen?
 
Also ich programmiere da so ein kleines Spiel. Ich will das auf einer Seite des Feldes auf unterschiedlichen Höhen immer ein Objekt erscheinen lassen. Allerdings erscheinen die Objekte immer auf einer Höhe und nicht auf unterschiedlichen Höhen.

@crykiller: Was genau willst du für ein Stück Code?
 
Zeig doch mal einfach den Teil, wo du den Zufallsgenerator verwendest. Ich denke mal, dass du da irgendwo einen Fehler haben wirst...
 
Wie AlrikvomFluss schon sagte den Teil in dem du den Zufallsgenerator benutzt.
 
Also dies ist der Anfang meiner Klasse:

import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
* Diese Klasse stellt den Marienkäfer Kara zur Verfügung. Bisher kann er nur das, was alle
* Tiere können (geerbte Methoden), nämlich vorwärts bewegen, drehen, schauen, ob ein Objekt
* (Baum, Pilz oder Kleeblatt) in der Nähe ist und es ggf. fressen (aufnehmen) oder ein solches
* Objekt ablegen.
*
* @author
* @version
*/
public class Kara extends Tier
{
int zufallx = Greenfoot.getRandomNumber(585)+1;
int zufally = Greenfoot.getRandomNumber(585)+1;
int zufallr = Greenfoot.getRandomNumber(10)-5;
int zufallgegner = Greenfoot.getRandomNumber(885);
int countergegner = 50;

Das sind meine Zufallsgeneratoren. Die stellen die verschiedenen Zufallszahlen her. Mein Problem bezieht sich auf die Zeile "int zufallgegner..." .Dann habe ich eine for-Schleife gemacht um die Objekte darzustellen:

if (Greenfoot.isKeyDown("b")) {
for (int i = 50;i > 0;i--) {
Gegner1 gegner1 = new Gegner1();
World welt = this.getWorld();
welt.addObject(gegner1,885,zufallgegner);
gegner1.setRotation(180);
}

Hier klicke ich dann auf "b" und nun sollen 50 Gegner von der einen Seite in unterschiedlichen Höhen auftauchen.
 
Zuletzt bearbeitet:
Naja, da ist ja klar dass die immer auf der gleichen Stelle sind. Du setzt erst die Zufallszahl und verwendest die dann 50 mal in der Schleife.
Um die immer zu variieren, musst du folgendes machen:

Code:
if (Greenfoot.isKeyDown("b")) {
     for (int i = 50;i > 0;i--) {
          Gegner1 gegner1 = new Gegner1();
          World welt = this.getWorld();
          int zufallgegner = Greenfoot.getRandomNumber(885);
          welt.addObject(gegner1,885,zufallgegner);
          gegner1.setRotation(180);
     }
}
 
Ok funktioniert nun.
Ich bedanke mich bei allem zur Lösung meines Problems.
Ergänzung ()

Ok ich habe nun noch ein Problem.
Die Objekte erscheinen ja jetzt in unterschiedlichen Höhen, aber auch alle nebeneinander, also dicht gedrängt.
Kann man das so umschreiben, dass insgesamt eine bestimmte Anzahl kommt, aber eben nicht so gedrängt sondern vielleicht auch in unterschiedlicher Breite?

wäre dankbar um ein paar Ratschläge.
 
Naja gugg dir doch mal die Doku zum Befehl
Code:
welt.addObject(gegner1,885,zufallgegner);
an. Da steht, dass das zweite Argument die X und das dritte die Y Koordinate ist. Da du immer die gleiche X Koordinate nimmst, verteilen sich die Gegner natürlich nicht.

Am besten besorgst du dir vorher zwei Variablen statt einer (zufallgegner) und verwendest die dann:

Code:
int zufallsgegnerX = Greenfoot.getRandomNumber(885);
int zufallsgegnerY = Greenfoot.getRandomNumber(885);
welt.addObject(gegner1,zufallsgegnerX ,zufallsgegnerY);
 
Diese Möglichkeit funktioniert zwar, allerdings meinte ich, dass die Objekte an einer Seite, also bei der x-Koordinate 885, starten sollen. Bei deiner Variante starten die Objekte mitten auf dem Feld.
 
Achso...

naja zu dem dicht gedrängt:
Du bringst auf 885 Feldern 50 Gegner unter, hast also im Durchschnitt etwa 15 Felder zwischen den Gegnern. Das ist relativ eng, wie hättest du es denn gerne? Kannst die ja auch regelmäßig verteilen
 
Das habe ich auch schon gemacht. Habe auf etwa 15 gekürzt. Da die Objekte wegen den Zufallszahlen aber auch übereinander liegen können, bringt das relativ wenig.
Hast du denn vielleicht noch eine Idee, wie ich das von dieser einen Seite machen könnte?
 
Code:
int zufallsgegnerX = 0;
for (int i = 50;i > 0;i--) {
          Gegner1 gegner1 = new Gegner1();
          World welt = this.getWorld();
          zufallsgegnerX = zufallsgegnerX + Greenfoot.getRandomNumber(17);
          welt.addObject(gegner1,885,zufallsgegnerX);
          gegner1.setRotation(180);
     }

Dann werden sie immer in ungleichmäßigen Abständen voneinander verteilt.
 
Also leider muss ich sagen, dass hierbei nur um die 1-3 Objekte erscheinen, da die Position x ja irgendwann über 885 kommt.
Aber ich will ja auch, dass die Objekte auch hintereinander und nebeneinander erscheinen können. Hauptsache von einer Seite.
 
Naja, du gehst 50 mal durch die Schleife, im ersten Durchlauf hast du zufallsgegnerY = 0.
Pro Runde addierst du 17 dazu, macht maximal 850, die sollten also noch alle im Feld sein.

Um das auf 3 oder 4 Reihen zu verteilen, könntest du folgendes machen:

Reihe = Zufallszahl zwischen 0 und 3;


Das dann in Code umsetzen und fertig ;)
 
Vielleicht noch eine kleine Hilfe?
 
Zurück
Oben