Here is an example randomRange() function that captures all the options discussed so far. Pass it a “mode” String and it will return a random range that fits inside the space, or, if it overflows, is then either cropped, wrapped, split, or simply allowed to overflow. I made it for int
/**
* RandomRanges
* useful approaches for generating distributions of random ranges
* in linear or circular spaces, e.g. hue colorspaces.
* 2020-01-07 Jeremy Douglass Processing 3.4
* see https://discourse.processing.org/t/minimum-and-maximum-random-numbers/16888/4
*/
void setup() {
for (int i=0; i<100; i++) {
println(randomRange(0, 360, 45, 90, "split"));
println();
}
}
float[] randomRange(float minVal, float maxVal, float minWide, float maxWide, String overflowMode) {
if (overflowMode.equals("fit")) {
float half = (random(minWide, maxWide) / 2.0);
float center = random(minVal + half, maxVal - half);
return new float[]{center - half, center + half};
}
float start = random(minVal, maxVal);
float end = start + random(minWide, maxWide);
if (end<=maxVal) return new float[]{start, end};
if (overflowMode.equals("crop")) return new float[] {start, maxVal};
if (overflowMode.equals("overflow")) return new float[] {start, end}; // redundant, added for clarity
if (overflowMode.equals("wrap")) return new float[] {start, end%maxVal};
if (overflowMode.equals("split")) return new float[]{minVal, end%maxVal, start, maxVal};
return null;
}