title: Method to uniformly randomly populate a disk with points in python
body: <p>I have an application that requires a disk populated with 'n' points in a quasi-random fashion. I want the points to be somewhat random, but still have a more or less regular density over the disk.</p>
  
  <p>My current method is to place a point, check if it's inside the disk, and then check if it is also far enough away from all other points already kept. My code is below:</p>
  
  <pre><code>import os
  import random
  import math
  
  # ------------------------------------------------ #
  # geometric constants
  center_x = -1188.2
  center_y = -576.9
  center_z = -3638.3
  
  disk_distance = 2.0*5465.6
  disk_diam = 5465.6
  
  # ------------------------------------------------ #
  
  pts_per_disk = 256
  closeness_criteria = 200.0
  min_closeness_criteria = disk_diam/closeness_criteria
  
  disk_center = [(center_x-disk_distance),center_y,center_z]
  pts_in_disk = []
  while len(pts_in_disk) &lt; (pts_per_disk):
      potential_pt_x = disk_center[0]
      potential_pt_dy = random.uniform(-disk_diam/2.0, disk_diam/2.0)
      potential_pt_y = disk_center[1]+potential_pt_dy
      potential_pt_dz = random.uniform(-disk_diam/2.0, disk_diam/2.0)
      potential_pt_z = disk_center[2]+potential_pt_dz
      potential_pt_rad = math.sqrt((potential_pt_dy)**2+(potential_pt_dz)**2)
  
      if potential_pt_rad &lt; (disk_diam/2.0):
          far_enough_away = True
          for pt in pts_in_disk:
              if math.sqrt((potential_pt_x - pt[0])**2+(potential_pt_y - pt[1])**2+(potential_pt_z - pt[2])**2) &gt; min_closeness_criteria:
                  pass
              else:
                  far_enough_away = False
                  break
          if far_enough_away:
              pts_in_disk.append([potential_pt_x,potential_pt_y,potential_pt_z])
  
  outfile_name = "pt_locs_x_lo_"+str(pts_per_disk)+"_pts.txt"
  outfile = open(outfile_name,'w')
  for pt in pts_in_disk:
      outfile.write(" ".join([("%.5f" % (pt[0]/1000.0)),("%.5f" % (pt[1]/1000.0)),("%.5f" % (pt[2]/1000.0))])+'\n')
  outfile.close()
  </code></pre>
  
  <p>In order to get the most even point density, what I do is basically iteratively run this script using another script, with the 'closeness' criteria reduced for each successive iteration. At some point, the script can not finish, and I just use the points of the last successful iteration.</p>
  
  <p>So my question is rather broad: is there a better way to do this? My method is ok for now, but my gut says that there is a better way to generate such a field of points.</p>
  
  <p>An illustration of the output is graphed below, one with a high closeness criteria, and another with a 'lowest found' closeness criteria (what I want).</p>
  
  <p><img src="https://i.stack.imgur.com/jnuRJ.png" alt="enter image description here"></p>
  
  <p><img src="https://i.stack.imgur.com/M87xL.png" alt="enter image description here"></p>