1

我有一个简单的问题:

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

谢谢!

4

2 回答 2

1

如果Visual Studio的原生RNG生成0到M-1之间的整数,计算K = p*M。生成任意数量的随机数,并以 K 为阈值以获得二进制随机脉冲。

其他方式是:

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

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

于 2013-03-19T20:00:01.713 回答
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 提供给您的发行版,以便它可以为您生成单个结果
于 2013-03-19T20:34:20.103 回答