// Sample returns N random points sampled from a fill with step // distance between low and hi inclusive. it will return a count > 1 // if the sample size is smaller than N. If n < 1 then return all // points. func (f *Fill) Sample(r *rand.Rand, n, low, high int) ([]Location, []int) { pool := make([]Location, 0, 200) lo, hi := uint16(low), uint16(high) for i, depth := range f.Depth { if depth >= lo && depth <= hi { pool = append(pool, Location(i)) } } if n < 1 { return pool, nil } if len(pool) == 0 { return nil, nil } over := n / len(pool) perm := r.Perm(len(pool))[0 : n%len(pool)] if Debug[DBG_Sample] { log.Printf("Sample: Looking for %d explore points %d-%d, have %d possible", n, low, hi, len(pool)) } var count []int if over > 0 { count = make([]int, len(pool)) for i := range count { count[i] = over } } else { count = make([]int, len(perm)) } for i := range perm { count[i]++ } if over > 0 { return pool, count } else { pout := make([]Location, len(perm)) for i, pi := range perm { if Debug[DBG_Sample] { log.Printf("Sample: adding location %d to output pool", pool[pi]) } pout[i] = pool[pi] } return pout, count } return nil, nil }