Почему символ случайной потери не работает

Я пытаюсь сделать случайную потерю из данного потока битов. Предположим, что у меня есть поток битов как

10 01 10 11 00

Теперь я создам код для реализации случайной потери. Функция с двумя входами — это исходный поток битов и процент потерь. Выходная функция — выходной поток битов

int* bitloss(int* orbit,int size_orbit,float loss_percent)
{
srand(time(NULL));
int* out_bitstream=(int*)malloc(sizeof(int)*size_orbit);
double randval ;
for(int i=0;i<size_orbit,i++)
{
randval = (double)rand()/(double)RAND_MAX;
if(randval<loss_percent)
out_bitstream[i]=-1;
else out_bitstream[i]=orbit[i];

}
return out_bitstream;
}

Этот код изменит значение исходного бита на -1, если случайное значение ниже, чем loss_percent. Я вызываю -1 бит, это бит потери. Таким образом, данный loss_percent равен 20%. Это означает, что я потеряю 2 пакета из 10 оригинальных битов. Но когда я это сделаю. Я показываю, что некоторое время я теряю 0 бит, иногда 4 бит, а иногда 2 бит. Это не стабильно. Как отредактировать мой код до стабильной потери. Например, я хочу потерю 20%. Так что количество битов -1 равно 2. Большое вам спасибо

-1

Решение

Предполагая, что каждый бит имеет вероятность p потери и что потеря битов не зависит (это может не иметь место, например, в некоторых каналах с замиранием, где потеря битов чаще всего происходит в пакетах), количество потерянных битов N биты следует за биномиальное распределение.

Таким образом, для 10 битов и коэффициента потерь 20% вы получите следующее распределение:
В (10,0.2)

Точно так же для 1000 битов и того же коэффициента потерь в 20% вы получите следующее распределение:
В (1000,0.2)

Обратите внимание, что по мере того, как общее число битов увеличивается, биномиальное распределение приближается к гауссовскому распределению со средним Np и дисперсия Np(1-p) ,
В частности, для случая N=1000 а также p=0.2 перекрытие гауссовского распределения над биномиальным распределением дает:
введите описание изображения здесь

Как видите, это довольно хорошее приближение.

4

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

Это проблема со случайными числами: они случайные. Если бы он всегда отбрасывал 2 пакета, он не был бы случайным.

Если хотите всегда потерять 2 пакета из 10, затем просто случайным образом выбрать эти пакеты. Что-то вроде…

int firstLoss, secondloss;
firstLoss = rand() % 10;

do {
secondloss = rand() % 10;
} while (secondLoss == firstLoss);

Нам нужен цикл while (или подобный вид «настройки»), чтобы избежать выбора одного и того же пакета дважды …

1