二项分布压缩

时间:2017-06-11 13:26:50

标签: c++ opencl probability logical-operators binomial-coefficients

我目前很难为一个问题找到一个快速和低内存的解决方案。我试图使用二项分布求解。我有一个可以取5个值的二项分布,出现的值的概率是1 / 16,4 / 16,6 / 16,4 / 16,1 / 16。我目前正在使用4位数来访问大小为16的二项分布数组,其中包含5个值,其出现次数与其概率成比例。有没有办法将数组压缩到5号,仍然能够快速确定要访问的数组中的哪个元素。我考虑使用卡诺图,但是所需的逻辑操作数减慢了整个过程。是否存在某种压缩或技术以快速实现这一点,因为我希望增加二项分布的大小,由于内存或计算时间的增加,目前这是不可行的。

  binomialCoefficients[16]= {v1, v2, v2, v2, v2, v3, v3, v3, v3, v3, v3, v3, v4, v4, v4, v4, v5};
  for (int i = 0; i < steps; i++) {
     uint random = MWC64X(&seed2);
     currentValue = currentValue * binomialCoefficients[random & 0b1111];
  }

VS

 binomialCompressed[5]={v1,v2,v3,v4,v5};
 for (int i = 0; i < steps; i++) {
    uint random = MWC64X(&seed2);
    bool A = (random & 0b1000) >>3;
    bool B = (random & 0b0100) >>2; 
    bool C = (random & 0b0010) >>1; 
    bool D = (random & 0b0001); 
    uint logicMappedIndex = (A&B&C&D)<<2 + (A&!B|...)<<1 +...;
    currentValue = currentValue * binomialCompressed[logMappedIndex];
}

1 个答案:

答案 0 :(得分:3)

当您生成一个随机数时,每个位的概率为1/2的1。 如果你只计算这些位,它已经在你的压缩数组中给出了二项式概率的索引。

 binomialCompressed[5]={v1,v2,v3,v4,v5};
 for (int i = 0; i < steps; i++) {
     uint random = MWC64X(&seed2) & 0b1111; //Get 4 bits only
     uint count = popcount(random);
     currentValue = currentValue * binomialCompressed[count];
 }