我有一个简单的问题:
我正在尝试模拟一系列数字脉冲(最大值 = 1,最小值 = 0)。ON-times 的分布应该遵循二项分布。我该怎么做呢?我正在使用 VisualStudio 2012。这是一个非常微不足道的问题,我并不是要浪费任何人的时间,但由于某种原因,当我想到这个问题时,我的大脑无法正常工作。我需要生成一个非常大的数据集(300Mb)。
谢谢!
我有一个简单的问题:
我正在尝试模拟一系列数字脉冲(最大值 = 1,最小值 = 0)。ON-times 的分布应该遵循二项分布。我该怎么做呢?我正在使用 VisualStudio 2012。这是一个非常微不足道的问题,我并不是要浪费任何人的时间,但由于某种原因,当我想到这个问题时,我的大脑无法正常工作。我需要生成一个非常大的数据集(300Mb)。
谢谢!
如果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 的预期概率。
这显示了如何生成遵循二项分布的数字。
我编辑了 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);
}
另请查看这篇文章以查看可能更简单的示例。
关键点是: