我目前很难为一个问题找到一个快速和低内存的解决方案。我试图使用二项分布求解。我有一个可以取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];
}
答案 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];
}