%
% aloha(n_step, p_0, p_1, p)
%
% n_step =  antal tidssteg
% p_0 = sannolikheten att 0 nya meddelande kommer
% p_1 = sannolikheten att 1 nytt meddelande kommer
% p_2 = 1 - (p_0 + p_1) = sannolikheten att 2 nya meddelande kommer
% p = sannolikheten för att ett meddelande i kön försöker sändas
%
% Försöker man sända två eller fler meddelanden så misslyckar man och de
% läggs på kön.
function aloha(n_step, p_0, p_1, p)

p_2=1-(p_0+p_1);

if p_0 + p_1 < 1

else
     disp('p_0 + p_1 + p_2 > 1')
     return
end

queue=[0];
through=0;

for i=2:n_step

     %Hur många meddelande kommer??
     r_a=rand;
     if r_a < p_0
         a=0;
     elseif p_0 < r_a && r_a < p_0 + p_1
         a=1;
     else
         a=2;
     end

     %Vad händer med kön??
     if queue(i-1)==0
         if a==2
             queue(i)=2;
         elseif a==1
             queue(i)=0;
             through = through + 1;
         else
             queue(i)=0;
         end
     else
         if a==0
             r_q=rand(1,queue(i-1));
             if length(find(r_q<p))==1
                 queue(i)=queue(i-1)-1;
                 through = through + 1;
             else
                 queue(i)=queue(i-1);
             end
         elseif a==1
             r_q=rand(1,queue(i-1));
             if length(find(r_q<p))==0
                 queue(i)=queue(i-1);
                 through = through + 1;
             else
                 queue(i)=queue(i-1)+1;
             end
         else
             queue(i)=queue(i-1)+2;
         end
     end
end

figure;
stairs(queue)
titleline=sprintf('Simulering av en Aloha-kö med p_0= %0.2f, p_1= %0.2f, p_2= %0.2f och p= %0.2f', p_0, p_1, p_2, p);
title(titleline);
textline=sprintf('Antal genomsläppta meddelanden = %i', through);
text(n_step/10,max(queue)-1,textline);
