Как генерировать серию импульсов, время включения которых следует за биномиальным распределением?
У меня простой вопрос:
Я пытаюсь смоделировать последовательность цифровых импульсов (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 вашему дистрибутиву, чтобы он мог сгенерировать для вас один результат