Сжатие биномиального распределения

В настоящее время мне трудно найти решение проблемы с быстрым и малым объемом памяти. Я пытаюсь решить, используя биномиальное распределение. У меня есть биномиальное распределение, которое может принимать 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];
}

В.С.

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]