2014-10-20 3 views
0

Я пытаюсь использовать mersenne twister для создания образцов из разных дистрибутивов. У меня есть один генератор, и он используется для генерации всех них. Что-то странное (для меня как минимум) происходит здесь. С одной стороны, вычисление коэффициента корреляции различных выборок дает мне почти ноль, что кажется приятным. Но когда я изменяю параметр одного дистрибутива (который нигде больше не используется), он каким-то образом меняет результаты, которые я получаю в других. В частности:Независимость с boost random

#include <boost/random.hpp> 

using namespace boost; // boost random library for random generators 

mt19937 generator(7687); // mersenne twister random number generator, seed = 7687 

double normal_sample(double mu, double sigma) 
// returns a sample from normal distribution with mean mu and variance sigma 
{ 
    normal_distribution<> norm_dist; 
    variate_generator<mt19937&, normal_distribution<> > norm_rnd(generator, norm_dist); 

    return(mu + sigma * norm_rnd()); 
}  

double poisson_sample(double intensity) 
// returns a number of points in a realization of a Poisson point process 
{ 
    poisson_distribution<> poiss_dist(intensity); 
    variate_generator<mt19937&, poisson_distribution<> > poiss_rnd(generator, poiss_dist); 

    return(poiss_rnd()); 
} 

Это код ... генератор часть, то я черпаю из этих двух распределений, изменяя параметр называется intensity. Это меняет не только образец Пуассона, но и нормальный. Фактически, теперь, когда я думаю об этом, это имеет смысл, потому что мой образец Пуассона определяет количество точек, которые также генерируются случайным образом с использованием того же генератора ... поэтому тогда в зависимости от того, сколько из них есть, я получаю что-то еще, потому что нормальный образец генерируется с использованием разных чисел в последовательности. Это верно?

Если да, то как это можно изменить? Должен ли я использовать несколько генераторов?

ответ

1

Это, вероятно, означает, что в зависимости от параметров из mersenne twister извлекаются меньше или более случайных выборок.

Это логически подразумевает, что все другие результаты сдвинуты, делая все другие результаты разными.

[...] это отчасти имеет смысл, потому что мой Пуассон образец определяет число точек, которые также генерируются случайным образом, используя тот же генератор ... так, то тогда в зависимости от того, сколько из них есть , Я получаю что-то другое, потому что нормальный образец генерируется с использованием разных чисел в последовательности. Это верно?

Кажется, что вы поняли, что да.

Если вы хотите повторимый PRNG, используйте отдельные состояния PRNG, то есть различные mersenne egnines.

+0

Я читал в другом месте по stackexchange, что использование более одного генератора иногда не совсем лучшая идея. Если я использую 5 генераторов с разными семенами, могу ли я быть уверенным, что сгенерированные последовательности не перекрываются? Или есть какие-либо рекомендации по выбору семян в этом случае (возможно, большие семена, которые находятся далеко друг от друга или что-то еще) ?. Должен признаться, я не изучал, как работает mersenne twister, так что, может быть, это глупый вопрос :) – Trademark

+0

Расстояние семян явно не должно иметь значения (они могут быть смежными для всего, что имеет значение). Действительно, чтобы предотвратить шаблоны, вы должны рассмотреть возможность использования одного генератора (хотя, рассмотрите потоки ...). Но тогда вам нужно отказаться от «удобства» от детерминированных случайных потоков, даже если вы меняете дистрибутивы для некоторых потребителей. – sehe

+0

Хорошо, спасибо. Возможно, я смогу проверить код с помощью нескольких генераторов, возможно, жертвуя независимостью (но имея возможность контролировать то, что я получаю в одном месте, когда меняю параметры где-то еще), а затем переключитесь обратно на использование только одного генератора, когда все кажется более или менее отлажено. Кроме того, я не совсем понимаю, что вы подразумеваете, рассматривая потоки ... Или то, что в этом контексте имеет значение threading: – Trademark

Смежные вопросы