# Zufallsposition



## Chaosprogrammer (14. Feb 2010)

Hallo!

Ich möchte bei meinem Spiel Objekte zufällig herunterfallen lassen.
Die Karte hat die Maße 400*600 und ich möchte eben eine zufällige x-Position.

Das funktioniert soweit.Nun möchte ich aber nur einen bestimmten Bereich von x in die Zufallsberechnung einbeziehen!

An der Stelle komme ich gerade nicht weiter.

Hier mal der Code der Methode:


```
object.setX((int)(Math.random()*(this.getWidth()-this.getWidth())));
```

Wie kann ich jetzt bei diesem getWidth den Bereich genau definieren?


----------



## Marco13 (14. Feb 2010)

Wenn bei [c]this.getWidth()-this.getWidth()[/c] etwas anders als 0 rauskommt, liegt irgendwas im Argen.... 

Wenn man ein Fenster der Breite w=600 hat, und zufällig zwischen x0=200 und x1=400 eine Position haben will, kann man sowas machen wie

```
int x0 = 200;
int x1 = 400;
int x = x0+(int)(Math.random()*(x1-x0));
```


----------



## Steev (14. Feb 2010)

Marco13 hat gesagt.:


> Wenn bei [c]this.getWidth()-this.getWidth()[/c] etwas anders als 0 rauskommt, liegt irgendwas im Argen....



Rein theoretisch könnte das schon passieren, wenn man mit mehreren Threads arbeitet und der Sheduler genau an dieser Stelle die Verarbeitung des ersten Threads unterbricht um einen Thread abzuarbeiten, der das width-Attribut verändert. Die Warscheinlichkeit ist zwar sehr gering, aber man sollte generell nicht mehrfach einen Getter verwenden sondern nur einmal den Wert mithilfe des Getters in eine lokale Variable schreiben und diese dann verwenden.


----------



## Marco13 (14. Feb 2010)

Steev hat gesagt.:


> Rein theoretisch könnte das schon passieren, wenn man mit mehreren Threads arbeitet und der Sheduler genau an dieser Stelle die Verarbeitung des ersten Threads unterbricht um einen Thread abzuarbeiten, der das width-Attribut verändert. Die Warscheinlichkeit ist zwar sehr gering, aber man sollte generell nicht mehrfach einen Getter verwenden sondern nur einmal den Wert mithilfe des Getters in eine lokale Variable schreiben und diese dann verwenden.



Diesen Fall hatte ich schon im Hinterkopf. Genauso wie den Fall, dass getWidth mit sowas überschrieben ist wie

```
int getWidth()
{
    int result = width;
    width += 1;
    return result;
}
```
:autsch: 
Deswegen auch nur die allgemeine Aussage: WENN dort etwas anderes als 0 rauskommt, liegt irgendwas im Argen - egal ob Threadingprobleme oder murksige Implementierungen


----------



## Empire Phoenix (15. Feb 2010)

randzahl*wertebereich-(wertebereich/2)
wertebereich = 50-> zahlen zwischen -25und+25
randzalh*wertebereich
wertebereich = 100-> zajhlen zwischen 0 und 100


----------

