Я пытаюсь сделать случайную потерю из данного потока битов. Предположим, что у меня есть поток битов как
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. Большое вам спасибо
Предполагая, что каждый бит имеет вероятность p
потери и что потеря битов не зависит (это может не иметь место, например, в некоторых каналах с замиранием, где потеря битов чаще всего происходит в пакетах), количество потерянных битов N
биты следует за биномиальное распределение.
Таким образом, для 10 битов и коэффициента потерь 20% вы получите следующее распределение:
Точно так же для 1000 битов и того же коэффициента потерь в 20% вы получите следующее распределение:
Обратите внимание, что по мере того, как общее число битов увеличивается, биномиальное распределение приближается к гауссовскому распределению со средним Np
и дисперсия Np(1-p)
,
В частности, для случая N=1000
а также p=0.2
перекрытие гауссовского распределения над биномиальным распределением дает:
Как видите, это довольно хорошее приближение.
Это проблема со случайными числами: они случайные. Если бы он всегда отбрасывал 2 пакета, он не был бы случайным.
Если хотите всегда потерять 2 пакета из 10, затем просто случайным образом выбрать эти пакеты. Что-то вроде…
int firstLoss, secondloss;
firstLoss = rand() % 10;
do {
secondloss = rand() % 10;
} while (secondLoss == firstLoss);
Нам нужен цикл while (или подобный вид «настройки»), чтобы избежать выбора одного и того же пакета дважды …