如何生成一系列脉冲,其开启时间遵循二项分布?

时间:2013-03-19 19:23:48

标签: algorithm binomial-cdf

我有一个简单的问题:

我正在尝试模拟一系列数字脉冲(max = 1,min = 0)。 ON时间的分布应遵循二项分布。我该怎么做呢?我正在使用VisualStudio 2012.这是一个非常微不足道的问题,我并不是要浪费任何人的时间,但出于某种原因,当我想到这个问题时,我的思维不起作用。我需要生成一个非常大的数据集(300Mb)。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果visual studio的原生RNG生成0到M-1之间的整数,则计算K = p * M.生成您喜欢的任意数量的随机数,并将它们设置为K以获得二进制随机脉冲。

其他方式是:

对于每个可能的字节(整个256个)计算1的数量。创建两组(可能是不等大小的)字节A和B,使得p = 0.5 *概率一(A)+ 0.5 *概率一(B)。现在每时每刻随机选择一个集合(A或B),然后从集合中随机选择一个元素。这样,每生成一个随机数就会得到8个脉冲。

注意:p是1s的预期概率。

答案 1 :(得分:1)

这显示了如何生成binomial distribution之后的数字。

我编辑了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); 
}

同时查看this post以查看可能更简单的示例。

关键点是:

  • 选择RNG
  • 定义您的发行版
  • 将RNG分配给您的分发,以便它可以为您生成单个结果