簡體   English   中英

在圓內生成均勻分布的點

[英]Generate uniformly distributed points in a circle

''' 我試圖在一個應該均勻分布的圓圈中生成點,但我得到了一個奇怪的模式。 如果我將半徑 R 增加到一個非常大的值,則分布看起來很正常,但 R 值較小時會產生螺旋。 有什么改進代碼的建議嗎? '''

from numpy.random import uniform
#from scipy.stats import uniform
import matplotlib.pyplot as plt
import numpy as np
import math  

R = 5
# Generate uniformly distributed random numbers.
rand_num = []
for i in range(30000):
    rand_num.append(np.random.uniform(0,1))

# Use these generated numbers to obtain the CDF of the radius which is the true radius i.e. r = R*sqrt(random()).
radius = []
for n,data in enumerate(rand_num):
    radius.append(R*math.sqrt(data))

# Generate the angle using the same uniformly distributed random numbers.
theta2 = []
for n, k in enumerate(radius):
    theta2.append(2*math.pi*radius[n])

# Calculate the corresponding x-coordinate.
x = []
for j,v in enumerate(radius):
    x.append(radius[j]*math.cos(theta2[j]))
x = np.array(x)   

# Calculate the correspoding y-coordinate.
y = []    
for j,v in enumerate(radius):
    y.append(radius[j]*math.sin(theta2[j]))
y = np.array(y)

# Finally plot the coordinates.
plt.figure(figsize=(10,10))
plt.scatter(x, y, marker='o')

是的,代碼應該給你一個螺旋,因為thetaradius都與rand_num成正比。 相反,您應該獨立生成thetaradius 此外,使用 numpy 的矢量化運算符而不是數學的

R = 5
num_points = 10000

np.random.seed(1)
theta = np.random.uniform(0,2*np.pi, num_points)
radius = np.random.uniform(0,R, num_points) ** 0.5

x = radius * np.cos(theta)
y = radius * np.sin(theta)

# visualize the points:
plt.scatter(x,y, s=1)

Output:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM