我目前很难解决一个快速且低内存的问题。我试图解决使用二项分布。我有一个二项式分布,可以采用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/