Является ли перезапуск генератора случайных чисел эквивалентным перезапуску процесса Бернулли?
Я хочу смоделировать процесс Бернулли. Я бросаю монету N раз
initRand();
p = 0.5;
for ( int i=0; i<N; i++) {
x = rand();
if ( x < p ) success();
else failure();
}
Теперь два сценария:
(i) В этот момент я продолжаю бросать монету до 2*N:
for (; i<2*N; i++) {
x = rand();
if ( x < p ) success();
else failure();
}
(ii) здесь я перезапускаю случайную последовательность и продолжаю падать до 2*N:
initRand();
for (; i<2*N; i++) {
x = rand();
if ( x < p ) success();
else failure();
}
В первом сценарии вероятность k успехов за 2 * N бросков рассчитывается как
P(success)=nchoosek(2*N,k)*p^k*(1-p)^(2*N-k)
Правильно ли это для второго сценария? Или из-за сброса генератора мы не можем думать о 2 * N циклах как об одном процессе?
2 ответа
В общем случае ответ зависит от используемого алгоритма генератора псевдослучайных чисел (PRNG) и от того, как initRand
реализовано.
PRNG предназначены для получения последовательности значений, которые статистически имитируют независимость и одинаковое распределение. Насколько они успешны, сильно варьируется. Все PRNG поддерживают некоторое внутреннее состояние, которое алгоритмически обновляется для получения следующего значения. Посев генератора означает выбор исходного состояния. Генератором по умолчанию в Matlab является Mersenne Twister (mt19937), что довольно неплохо в таких ситуациях. Если вы начнете начислять без сброса, ваши испытания Бернулли будут независимыми.
Это подводит нас к вопросу о initRand
, Поскольку это не встроенный Matlab, я понятия не имею, как реализован тот, который вы используете. Если он устанавливает PRNG в одно и то же состояние каждый раз, когда вы вызываете его, то ваши две последовательности в конечном итоге будут идеально соотнесены друг с другом. Если он выбирает произвольное начальное состояние, основанное на локальной энтропии, все еще возможно иметь некоторое наложение полученных последовательностей, и результаты будут частично коррелированы. Хорошая новость заключается в том, что с пространством состояний размера 219937-1 вероятность увидеть это в Мерсенн Твистер невероятно мала. Однако, если он выбирает начальное число на основе времени и ваша программа работает достаточно быстро, есть вероятность, что две последовательности могут быть засечены в один и тот же такт часов и в конечном итоге будут идентичны.
Когда все сказано и сделано, ваша самая безопасная ставка - не сбрасывать состояние с initRand
в середине.
Все числа, сгенерированные алгоритмом, будут только псевдослучайными. Сброс алгоритма, таким образом, поставит вас в начало заранее определенной последовательности случайных чисел.
Это означает, что в случае (i) у вас будет последовательность 2*N
числа, которые можно рассматривать как независимый случайный процесс.
Однако если вы сбросите алгоритм в (ii), вы получите то же самое N
цифры вы нарисовали в первый раз. Числа все еще из того же случайного распределения, но первое N
цифры соотносятся со вторым N
номера. Поэтому вероятность успеха будет определяться первым N
записи и не все 2*N
,