如何使随机丢失比特遵循高斯分布

时间:2014-06-11 13:32:39

标签: c++ visual-studio-2010 signal-processing

目前,我正在制定一个程序,以给定损失率生成损失位。

假设我有多个位输入N = 1000,其中N位中的位丢失数跟在binomial distribution之后。假设每个位具有丢失概率p = 20%,并且该位丢失是独立的。因此,对于1000位和20%的丢失率,您将获得以下高斯分布:reference,其中均值为Np,方差为Np(1-p)。我们可以使用蒙特卡罗模拟来实现它。据我所知,我得到here

我不知道如何在C / C ++中实现该方案。你能告诉我如何用输入生成位错误是总位和概率误差。这是我在C / C ++中的尝试,但它看起来不像理论:

int* bitloss(int* orbit,int size_orbit,int loss_percent) {

    int* out_bitstream=(int*)malloc(sizeof(int)*size_orbit);
    int randval ;
    std::random_device rd;
    std::mt19937 generator(rd());
    generator.seed( rd() );
    std::uniform_int_distribution<> distribution(0, 100);

    for(int i=0;i<size_orbit,i++) {
        rand_loss = distribution(generator);
        if(randval<((int)lossbitprob*100)) 
             out_bitstream[i]=-1;
        else out_bitstream[i]=orbit[i];
    }

    return out_bitstream;
}

1 个答案:

答案 0 :(得分:1)

如果样本数量(size_orbit)足够大,则earlier post的代码:

for(int i=0;i<size_orbit,i++)
{
  randval = (double)rand()/(double)RAND_MAX;
  if(randval<loss_percent) 
     out_bitstream[i]=-1;
  else out_bitstream[i]=orbit[i];
}

应该(没有变化)收敛到所述的理论结果。 也就是说,如果您使用以下方法计算直方图:

int histogram[size_orbit+1] = {0};
for (int j=0; j<number_of_experiments; j++)
{
  int count = 0;
  for (int i=0; i<size_orbit; i++)
  {
    if (out_bitstream[i] == -1)
      count++;
  }
  histogram[count]++;
}

然后,每个实验中比特丢失总数的相对出现应该收敛到高斯分布,均值为Np,方差为Np(1-p)。或者换句话说,每个实验中的丢失位数可能会出现如下所示的“as-if”:

double mean        = size_orbit * loss_percent; // Np
double variance    = size_orbit * loss_percent * (1.0 - loss_percent); // Np(1-p)
double sigmarandom = sqrt(std::max(0.0, variance));
std::normal_distribution<double> distribution(mean,sigmarandom);
int lossbitcount = round(distribution(generator));