static IntRange varyIntRange(IntRange r, int variation, int minLength, int min, int max) { // vary start within min/max int start = random(max(min, r.start-variation), min(max, r.start+variation)+1); // vary end within .../max int end = random(r.end-variation, min(max, r.end+variation+1)); // make longer if too short end = max(end, start+minLength); // move left if too long if (end > max) { int shift = end-max; start -= shift; end -= shift; } ret intRange(start, end); }