Как генерировать серию импульсов, время включения которых следует за биномиальным распределением?

У меня простой вопрос:

Я пытаюсь смоделировать последовательность цифровых импульсов (max=1, min=0). Распределение времени включения должно следовать за биномиальным распределением. Как мне это сделать? Я использую VisualStudio 2012. Это очень тривиальный вопрос, и я не хочу тратить впустую время, но по какой-то причине мой ум не работает, когда я думаю об этой проблеме. Мне нужно создать очень большой набор данных (300 МБ).

Спасибо!

2 ответа

Если собственный RNG визуальной студии генерирует целые числа от 0 до M-1, вычислите K = p*M. Создайте столько случайных чисел, сколько вам нужно, и пороговое значение их на K, чтобы получить двоичные случайные импульсы.

Другой способ будет:

Для каждого возможного байта (всего 256) подсчитайте количество единиц. Создайте два набора (возможно, неодинакового размера) байтов A и B, таких что p = 0,5* Вероятность одного (A) + 0,5* Вероятность одного (B). Теперь в любой момент случайным образом выбирайте набор (A или B), а затем случайным образом выбирайте элемент из набора. Таким образом, вы получите 8 импульсов для каждого сгенерированного случайного числа.

ПРИМЕЧАНИЕ: р - ожидаемая вероятность 1 с.

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

Я отредактировал пример Microsoft и постарался придать переменным лучшее имя и сделать их проще для чтения.

Мое понимание вероятности и статистики ослабевает, так как прошло много времени с тех пор, как я их использовал, поэтому я надеюсь, что это правильно...

#include <random> //include the random number library
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{ 
    mt19937 rng; //create an instance of the Mersenne Twister PRNG
    binomial_distribution<int, double> binomDistribution(2, 0.6); //create distribution using t=2 and p= 0.6
    auto randomNumber = rng(); //get a random number from the RNG
    auto binDistValue = binomDistribution(rng); //get a binomial distributed number from the RNG

    std::cout << "p == " << binomDistribution.p() << std::endl; 
    std::cout << "t == " << binomDistribution.t() << std::endl; 

    binomDistribution.reset(); // discard any cached values 

    const auto valuesToPrint = 100;
    cout << "First " << valuesToPrint << " values of the binomial distribution are:" << endl;
    for(int i=0; i<valuesToPrint; ++i)
    {
        auto aSampledValue = binomDistribution(rng);
        cout << aSampledValue << endl;
    }    

    return (0); 
}

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

Ключевые моменты:

  • выбрать RNG
  • определить ваше распределение
  • дайте RNG вашему дистрибутиву, чтобы он мог сгенерировать для вас один результат
Другие вопросы по тегам