Равномерное распределение со случайным

Я знаю, если я использую генератор Random из Java, генерируя числа с nextInt, числа будут равномерно распределены. Но что произойдет, если я использую 2 экземпляра Random, генерируя числа с обоими классами Random. Числа будут равномерно распределены или нет?

Ответы

Ответ 1

Цифры, генерируемые каждым экземпляром Random, будут равномерно распределены, поэтому, если вы объедините последовательности случайных чисел, сгенерированных экземплярами Random, они также должны быть равномерно распределены.

Обратите внимание, что даже если результирующее распределение равномерно, вы можете обратить внимание на семена, чтобы избежать корреляции между выходом двух генераторов. Если вы используете конструктор no-arg по умолчанию, семена должны быть уже разными. Из исходного кода java.util.Random:

private static volatile long seedUniquifier = 8682522807148012L;

public Random() { this(++seedUniquifier + System.nanoTime()); }

Если вы задаете семя явно (используя конструктор Random(long seed) или вызывающий setSeed(long seed)), вам нужно позаботиться об этом самостоятельно. Одним из возможных подходов является использование генератора случайных чисел для получения семян для всех других генераторов.

Ответ 2

Хорошо, если вы засеиваете оба экземпляра Random с одинаковым значением, вы, безусловно, не получите качественное дискретное равномерное распределение. Рассмотрим самый простой случай, который буквально печатает то же самое число дважды (не получается намного менее случайным, чем это...):

public class RngTest2 {
    public static void main(String[] args) throws Exception {
        long currentTime = System.currentTimeMillis();
        Random r1 = new Random(currentTime);
        Random r2 = new Random(currentTime);
        System.out.println(r1.nextInt());
        System.out.println(r2.nextInt());
    }        
}

Но это всего лишь одна итерация. Что произойдет, если мы начнем проверять размер выборки?

Вот график рассеяния распределения от запуска двух одинаковых семян RNG для создания всего 2000 чисел:

alt text

И вот распределение запуска одного RNG для генерации всего 2000 чисел:

alt text

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

Теперь почти все знают, что посев двух RNG с одним и тем же семенем - плохая идея, если вы ищете качественную случайность. Но в этом случае вы останавливаетесь и думаете: мы создали сценарий, в котором каждый RNG независимо излучает довольно качественную случайность, но когда их выход комбинируется, он заметно ниже по качеству (менее дискретный.)