Creating a list of new areas for patches of conserved land within a watershed
The problem is that random.randrange(len(parcel_areas)-1) most of the times returns an area which fails the min_size &lt;= parcel_areas[rand_index] &lt;= max_size test. Therefore it is logical to restrict the random selection to the set of areas which satisfy the requirements beforehand, and eliminate the inner loop completely.

Sort the list of areas by size. Once you determined min_size and max_size, find corresponding bounds (with binary search), and select randomly within these bounds.