проблема с Random.nextGaussian () - PullRequest
       13

проблема с Random.nextGaussian ()

6 голосов
/ 10 марта 2009

Random.nextGaussian () должен выдавать случайные номера со средним 0 и стандартным отклонением 1. Многие сгенерированные им номера находятся вне диапазона [-1, + 1]. как я могу установить так, чтобы он давал нормально распределенные случайные № только в диапазоне от -1 до 1.

Ответы [ 6 ]

17 голосов
/ 10 марта 2009

Гауссово распределение со средним 0 и стандартным отклонением, равным единице, означает, что среднее распределение составляет 0, и около 70% населения находится в диапазоне [-1, 1]. Игнорируйте числа, которые находятся за пределами вашего диапазона - они образуют полосу примерно на 16% с каждой стороны.

Возможно, лучшим решением будет создание дистрибутива с mean=0 и std.dev=0.5. Это даст вам распределение примерно с 96% значений в диапазоне [-1, 1].

Еще лучшим решением будет работать в обратном направлении, как указано выше, и использовать идею, что ок. 99,7% значений лежат в диапазоне 3 сигма: используйте std.dev = 1/3. Это почти сведет на нет количество не очень полезных значений, которые вы получаете. Когда вы его получите, опустите его.

Конечно, если вы работаете над продуктом с интенсивной математикой, все это не имеет значения.

10 голосов
/ 10 марта 2009

Разве нормальное распределение не включает числа, произвольно далекие от среднего, но с все более малой вероятностью? Возможно, ваши желания (нормальные и ограниченные определенным диапазоном) несовместимы.

6 голосов
/ 10 марта 2009

Нормальное распределение дает ненулевую (но «чрезвычайно малую») вероятность увидеть значения вне [-1, +1] независимо от того, что вы даете - вы просто эффективно сжимаете кривую.

Вы можете использовать небольшую дисперсию, а затем просто прогнать результаты по карте, которая обрезает что-либо меньше чем -1 до -1, и что-нибудь больше чем 1 к 1, но это (строго говоря) не будет нормальным распределением больше.

Для чего вам нужен этот дистрибутив, из интереса?

2 голосов
/ 10 марта 2009

Гауссово распределение с вашими параметрами. это имеет плотность е ^ (- х ^ 2/2). Как правило, он имеет форму e ^ (linear (x) + linear (x ^ 2)), что означает, что при любых настройках вы можете получить очень большие и очень маленькие числа.
Возможно, вы ищете какой-то другой дистрибутив.

1 голос
/ 25 января 2015

Этот код будет отображать count количество случайных гауссовских чисел на консоли (10 в строке) и впоследствии показывает некоторую статистику (наименьшее, наибольшее и среднее).

Если вы попробуете это с небольшим числом count , случайные числа, вероятно, будут в диапазоне [-1.0 ... +1.0], а среднее может быть в диапазоне [-0.1 ... +0.1]. Однако, если count превышает 10.000, случайные числа, вероятно, попадут в диапазон [-4.0 ... +4.0] (более невероятные числа могут появляться на обоих концах), хотя среднее значение может находиться в диапазоне [-0.001 ... +0,001] (ближе к 0).

public static void main(String[] args) {
    int count = 20_000; // Generated random numbers
    double lowest = 0;  // For statistics
    double highest = 0;
    double average = 0;
    Random random = new Random();

    for (int i = 0; i < count; ++i) {
        double gaussian = random.nextGaussian();
        average += gaussian;
        lowest = Math.min(gaussian, lowest);
        highest = Math.max(gaussian, highest);
        if (i%10 == 0) { // New line
            System.out.println();
        }
        System.out.printf("%10.4f", gaussian);
    }
    // Display statistics
    System.out.println("\n\nNumber of generated random values following Gaussian distribution: " + count);
    System.out.printf("\nLowest value:  %10.4f\nHighest value: %10.4f\nAverage:       %10.4f", lowest, highest, (average/count));
}
1 голос
/ 10 марта 2009

Стандартное отклонение 1,0 влечет за собой, что многие значения будут лежать вне диапазона [-1,1].

Если вам нужно оставаться в пределах этого диапазона, вам следует использовать другой метод, например nextDouble ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...