Вопрос немного стар, но если кто-то захочет сделать это без обработки специального случая, вы можете использовать функцию, подобную этой:
final static public Random RANDOM = new Random(System.currentTimeMillis());
static public double nextSkewedBoundedDouble(double min, double max, double skew, double bias) {
double range = max - min;
double mid = min + range / 2.0;
double unitGaussian = RANDOM.nextGaussian();
double biasFactor = Math.exp(bias);
double retval = mid+(range*(biasFactor/(biasFactor+Math.exp(-unitGaussian/skew))-0.5));
return retval;
}
Параметры делают следующее:
- min - минимально возможное искаженное значение
- max - максимально возможное искаженное значение
- skew - степень, в которой значения группируются вокруг режима распределения; более высокие значения означают более плотную кластеризацию
- смещение - тенденция режима приближаться к минимальному, максимальному или среднему значению; положительные значения смещения в сторону макс, отрицательные значения в сторону мин