Wie kann ich eine Mindestabstandsbeschränkung für das Generieren von Punkten mit numpy.random.rand festlegen?

Ich versuche, einen effizienten Code zum Erzeugen einer Anzahl zufälliger Positionsvektoren zu generieren, mit denen ich dann eine Paarkorrelationsfunktion berechne. Ich frage mich, ob es eine einfache Möglichkeit gibt, eine Beschränkung für den zulässigen Mindestabstand zwischen zwei Punkten in meiner Box festzulegen.

Mein Code lautet derzeit wie folgt:

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

Ich habe zuvor versucht, eine Schleife zu verwenden, die alle Abstände für jeden Punkt berechnet und dann akzeptiert oder abgelehnt hat. Diese Methode war sehr langsam, wenn ich viele Punkte verwende.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage