Tôi đang cố gắng tạo ra một mã hiệu quả để tạo ra một số vectơ vị trí ngẫu nhiên mà sau đó tôi sử dụng để tính toán một hàm tương quan cặp. Tôi tự hỏi nếu có cách đơn giản để thiết lập một hạn chế về khoảng cách tối thiểu cho phép giữa bất kỳ hai điểm được đặt trong hộp của tôi.Làm cách nào để tôi có thể đặt giới hạn khoảng cách tối thiểu để tạo điểm bằng numpy.random.rand?
Mã của tôi hiện nay là như sau:
def pointRun(number, dr):
"""
Compute the 3D pair correlation function
for a random distribution of 'number' particles
placed into a 1.0x1.0x1.0 box.
"""
## Create array of distances over which to calculate.
r = np.arange(0., 1.0+dr, dr)
## Generate list of arrays to define the positions of all points,
## and calculate number density.
a = np.random.rand(number, 3)
numberDensity = len(a)/1.0**3
## Find reference points within desired region to avoid edge effects.
b = [s for s in a if all(s > 0.4) and all(s < 0.6) ]
## Compute pairwise correlation for each reference particle
dist = scipy.spatial.distance.cdist(a, b, 'euclidean')
allDists = dist[(dist < np.sqrt(3))]
## Create histogram to generate radial distribution function, (RDF) or R(r)
Rr, bins = np.histogram(allDists, bins=r, density=False)
## Make empty containers to hold radii and pair density values.
radii = []
rhor = []
## Normalize RDF values by distance and shell volume to get pair density.
for i in range(len(Rr)):
y = (r[i] + r[i+1])/2.
radii.append(y)
x = np.average(Rr[i])/(4./3.*np.pi*(r[i+1]**3 - r[i]**3))
rhor.append(x)
## Generate normalized pair density function, by total number density
gr = np.divide(rhor, numberDensity)
return radii, gr
trước đây tôi đã cố gắng sử dụng một vòng lặp mà tính toán tất cả các khoảng cách cho mỗi điểm như nó đã được thực hiện và sau đó chấp nhận hoặc từ chối. Phương pháp này rất chậm nếu tôi sử dụng nhiều điểm.
Bạn có thể sử dụng một biến thể của [thuật toán này] (http://stackoverflow.com/questions/6002407/placing-random-circles-without-overlap-and-without-using-brute-force/6002708 # 6002708), nhưng báo trước là nó có độ phân giải tối thiểu (và nó càng cao thì càng tốn kém). – Rufflewind