Java Zufällige Koordinaten erzeugen - wie?

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

ich habe (mal wieder) ein Problem:
es geht um die zufällige Erzeugung von Koordinaten mit Java.

Bedingungen für die Koordinaten:
* Interval von 0 bis 1
* müssen im Kreis mit dem Mittelpunkt M(0,5|0,5) liegen
* sollten (auch bei geringer Koordinatenanzahl) gut gemischt über den Kreis verteilt sein

Wie mache ich soetwas?

Vielen Dank schon mal vorab,
CPU :(
 
Hi, ganz einfach,
du Pusht einfach sagen wir 100 zufallszahlen in ein Array.
Dann nimmst du dieses array und mischt durch, auch wieder mit Zufallszahlen.
Dazu nimmst du zwei Zufallszahlen (<= Array Länge) und tauscht dann an diesen zwei Positionen die Zahlen miteinander (a[random1]<=>a[random2).
Das ganze machst du beliebig oft.
Den Intervall erzeugst du einfach mit mod 1.
 
Du kannst mit Java ein Random objekt erstellen,
dazu:
import java.util.Random;

dann musstu
Random r = new Random();
und mit r kannstu dann ne menge verschiedene zufallszahlen erzeugen, z.B. r.nextInt(maxInt) oder so (wenn du eclipse (oder eine andere gute IDE) hast zeigt er dir ja an, was möglich ist)
 
Eine andere Möglichkeit und meiner Meinung nach auch die Sinnvollste in diesem Fall ist eine von Java zur Verfügung gestellte Methode. Ist im Math package enthalten und wird wie folgt benutzt:

Code:
// PROGRAMMAUSZUG

               //Spannweite des Intervalls berechnen
		int spannweite = obergrenze - untergrenze;
		
		//Zufallszahl innerhalb der Spannweite(Intervall) generieren
		int erg = (int) (Math.random()*spannweite);
		
		//Hinzuaddieren des Minimums, damit gewährleistet wird, dass die generierte Zahl nicht 
		//unter dem Minimum liegt.
		erg += untergrenze;

Tja und bei der Verteilung sag ich nur: Die Gaußsche' Normalverteilung ist Gesetz! :)

Mehr Infos dazu gibts in der API.
 
Auszug aus der API
Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range.

Uniform distribution ist die Gleichverteilung und nicht die Normalverteilung!
 
Die Zufallsgeneratoren aus dem Uncommons Math Paket ( https://uncommons-maths.dev.java.net/ ) sind statistisch wesentlich robuster als das "normale" Random (und zudem auch wesentlich schneller als SecureRandom).

Nach Erzeugung der Zufallszahl prüfst du halt, ob die Koordinate im Kreis ist. Wenn nicht, so erzeugst du einfach eine neue bis es passt.

Alternative (könnte schneller sein):
1. Du erzeugst eine Zufallszahl mit dem Radius (Bereich 0-x).
2. Du erzeugst eine Zufallszahl mit dem Winkel (Bereich 0-359.9999).
3. Aus den beiden Werten berechnest du dann die Verschiebung (gegenüber dem Mittelpunkt) des erzeugten Punktes mit y= sin(Winkel) * radius und x = cos(Winkel) * radius. Allerdings musst du da 4 Fallunterscheidungen machen für die Winkel 0-90, 90-180, 180-270 und 270-360. Ansonsten bügelt der sin/cos nämlich das +/- weg. Wenn du richtig rechnest liegt der Punkt dann aber immer im Kreis ;)
 
Zuletzt bearbeitet:
Hallo,
bin super zufrieden - es hat alles funktioniert: ich habe eine Klasse die mir Punkte generiert, die in dem entsprechenden Kreis liegen ... :)

Doch es kommt manchmal vor, dass in einem Bereich des Kreises garkeine Punkte liegen. Hat dazu vielleicht jemand eine Idee?

CPU
 
Zuletzt bearbeitet: (Fehler)
Welches Dreieck? Es ging doch um einen Kreis. Ohne deinen genauen Code kann man aber ohnehin nur rätseln...
 
Tut mir leid, da habe ich mich vertan. Ich meinte, dass in einem dreiecksförmigen Bereich keine Punkte liegen!
 
Hast du denn mal einen anderen Zufallszahlengenerator verwendet? Der "normale" Random ist wie bereits gesagt statistisch nicht sonderlich gut und dann kann es durchaus zu ungleichmäßigen Verteilungen kommen. Welche Variante der Zufallserzeugung hast du denn verwendet (ich hatte ja zwei genannt)?
 
Wieso macht ihr das denn so kompliziert? Du kennst den Mittelpunkt (xm=0.5, ym=0.5) des Kreises, sowie den Radius (r=0.5). Jetzt ziehst du zwei Zufallszahlen (x und y), und setzt das ganze in die Kreisgleichung ein.
Wenn du jetzt prüfen willst, ob dein "Punkt" innerhalb des Kreises liegt, rechnest du also (x-xm)^2+(y-ym)^2. Ist dies jetzt <r^2 liegt der Punkt in dem Kreis, bei =r^2 genau auf dem "Rand" des Kreises und sonst ausserhalb.
Das löst zwar nicht die Problematik des Generators, ist aber wesentlich einfacher als die Umrechnung der Polarkoordinaten in Karthesische.
 
Hä? Das entspricht ja genau der erwähnten 1. Methode (nur hab ich da keine Formel angegeben für die Prüfung obs im Kreis liegt) und hat eben den Nachteil, dass man Koordinaten erzeugen kann, die nicht existieren und somit mitunter mehrere Durchgänge braucht bis man eine Koordinate gefunden hat.
 
Du hast recht, das habe ich überlesen.
Soo viel mehr Zufallszahlen wird er gar nicht erzeugen müssen, im Schnitt sollte es mit rund 27.3% mehr getan sein, dafür ist er dann aber etwas nervige Fallunterscheidung bei den Winkeln los, und für mich klingt es so, als ob genau da ein Fehler passieren würde, wenn er mit dem "dreiecksförmigen Bereich" vielleicht einen Quadranten meint.
 
Zurück
Oben