Наклон генерации случайных чисел Java к определенному числу - PullRequest
9 голосов
/ 02 мая 2011

Как в Java вы сгенерируете случайное число, но сделаете это случайное число смещенным к определенному числу.Например, я хочу сгенерировать число от 1 до 100 включительно, но я хочу, чтобы это число было перекошено в сторону, скажем, 75. Но я все еще хочу возможность получения других чисел в диапазоне, но я хочу больше замены числаблизко к 75, а не к случайным числам по всему диапазону.Спасибо

Ответы [ 2 ]

18 голосов
/ 25 ноября 2012

Вопрос немного стар, но если кто-то захочет сделать это без обработки специального случая, вы можете использовать функцию, подобную этой:

    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 - степень, в которой значения группируются вокруг режима распределения; более высокие значения означают более плотную кластеризацию
  • смещение - тенденция режима приближаться к минимальному, максимальному или среднему значению; положительные значения смещения в сторону макс, отрицательные значения в сторону мин
6 голосов
/ 02 мая 2011

Попробуйте http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextGaussian()

Math.max(1, Math.min(100, (int) 75 + Random.nextGaussian() * stddev)))

Выберите стандартное значение, подобное 10, и поиграйте, пока не получите нужный дистрибутив.В 1 и 100 будет немного больше, чем в 2 или 99. Если вы хотите изменить скорость, с которой он падает, вы можете поднять гауссиан до степени.

...