public Target pickRandomAround(final Target origin, final float range) {
    origin.position(temp) ;
    final int oX = (int) temp.x, oY = (int) temp.y ;
    Node node = root ;
    while (true) {
      //
      //  For a given node level, iterate across all children and calculate the
      //  probability of visiting those.
      final Section quadKids[] = node.section.kids ;
      final boolean leaf = node.section.depth == 0 ;
      float weights[] = new float[node.size()], sumWeights = 0 ;
      int i = 0 ; for (Object k : node) {
        final float dist, pop ;
        if (leaf) {
          dist = Spacing.distance((Target) k, origin) ;
          pop = 1 ;
        }
        else {
          dist = ((Node) k).section.area.distance(oX, oY) ;
          pop = ((Node) k).population ;
        }
        if (range > 0 && dist > range) continue ;
        sumWeights += weights[i++] =
          pop * World.PATCH_RESOLUTION / (World.PATCH_RESOLUTION + dist) ;
      }
      //
      //  If no child is a valid selection, quit.  Otherwise, choose one child
      //  at random.
      if (sumWeights == 0) return null ;
      final float roll = Rand.num() * sumWeights ;
      int kidIndex = -1 ; sumWeights = 0 ;
      do { sumWeights += weights[++kidIndex] ; } while (sumWeights < roll) ;
      //
      //  If it's a leaf, return it.  Otherwise, move down the next level.
      if (leaf) return (Target) node.getEntryAt(kidIndex).refers ;
      node = (Node) node.getEntryAt(kidIndex).refers ;
    }
  }