【问题标题】:How to make random loss bits follow Gaussian distribution如何使随机丢失位遵循高斯分布
【发布时间】:2014-06-11 13:32:38
【问题描述】:

目前,我正在制作一个程序来生成具有给定丢失率的丢失位。

假设我的输入位数 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;
}

【问题讨论】:

  • 如果你真的需要that bit loss are independent,那么你需要随机数的均匀分布。每个轨道实际丢失的比特数将趋于接近正态分布。
  • @quamrana:真的。我们可以对随机数使用均匀分布,对吧?所以我的代码更新了。你能帮我检查一下吗?
  • 是的,您的代码现在对随机数使用均匀分布。您仍然需要解决上面代码中的其他问题 - 您应该真正提交实际编译的代码!
  • @quamrana:谢谢。我正在运行程序来检查输出是否接近高斯分布。让我们等待

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


【解决方案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)的高斯分布。或者换句话说,每个实验中的丢失比特数可能看起来“好像”由以下过程生成:

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));

【讨论】:

  • 谢谢先生,但我建议使用 std::uniform_int_distribution 而不是 randval = (double)rand()/(double)RAND_MAX;我正在运行程序来检查结果。
  • @SleuthEye:请注意,OP 现在已经编辑了问题中的代码。但是,您仍然有一个正确的答案。
  • @SleuthEye 和 quamrana:我检查了结果。损失计数看起来不像高斯分布。你可以在coliru.stacked-crooked.com/view?id=6f6af09b3cb2fe12查看它
  • for (int n=0... 之前设置loss_count=0,然后只增加hist for 循环之后。
  • @SleuthEye:让我们在coliru.stacked-crooked.com/view?id=02e477391a8ee1f3 检查结果。损失计数看起来像均匀分布。
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2020-08-24
  • 2015-04-22
相关资源
最近更新 更多