我有一个简单的问题:
我正在尝试模拟一系列数字脉冲(max = 1,min = 0)。 ON时间的分布应遵循二项分布。我该怎么做呢?我正在使用VisualStudio 2012.这是一个非常微不足道的问题,我并不是要浪费任何人的时间,但出于某种原因,当我想到这个问题时,我的思维不起作用。我需要生成一个非常大的数据集(300Mb)。
谢谢!
答案 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以查看可能更简单的示例。
关键点是: