我目前很难解决一个快速且低内存的问题。我试图解决使用二项分布。我有一个二项式分布,可以采用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的1/2。
如果仅对位数进行计数,它已经为您提供了具有二项式概率的压缩数组中的索引。

 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];
 }

关于c++ - 二项分布压缩,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44484359/

10-10 04:08