Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
N = 10000
r = 1
winkel = 2 * np.pi * np.random.rand(N)
radius = r * np.random.rand(N)
x = np.sin(winkel) * radius;
y = np.cos(winkel) * radius;
plt.scatter(x, y)
plt.show()
Ich berechne mir den Winkel aber direkt in radians, da np.random.rand() mir eine uniforme verteilung zwischen [0, 1] liefert.
Vermutlich ist das mit dem Modulo einfach nicht so gut.
Das die punktwolke mit zunehmendem radius weniger dicht ist, erscheint mir logisch.
Hier noch eine andere Idee:
man erzeugt Koordinatenpaare (x, y) und testet ob diese innerhalb des Kreises liegen. Dadurch erzeugt man eine homogene Punktverteilung innerhalb der Ebene und nicht eine homogene Verteilung der Polarkoordinaten.
Hier mal für den ersten Quadraten - man müsste eben die Vorzeichen für x und y noch variieren...
Code: Alles auswählen
import random
import matplotlib.pyplot as plt
def points(N, r):
c = 0
while c < N:
x = random.random()
y = random.random()
if x**2 + y**2 <= r**2:
c += 1
yield x, y
x, y = zip(*points(10000, 1))
plt.scatter(x, y)
plt.show()