Warchief
Функция pred вычисляет предыдущее число, т.е. вместо pred(i) можно ставить (i - 1).
Переменные i, j, l предназначены только для организации циклов. А r, m - содержат случайным образом выбранные два числа - номер строки и столбца в массиве.
Переменная p - логическая. Используется для проверки того, что новое сгенерированное число еще отсутствует в массиве. В принципе, это было можно решить с помощью множества (set of byte), только зачем...

Участок кода
Код:
repeat
p := true;
b[i] := random (99) + 1;
for j := 1 to pred (i) do
p := p and (b[j] <> b[i]);
until p;
создает в массиве b новое число b[i], отличное от предыдущих. А
Код:
for l := 1 to 2 do begin
repeat
r := random(n) + 1;
m := random(n) + 1;
until a[r, m] = 0;
a[r, m] := b[i];
end;
Вставляет это чило 2 раза на пустые места в массиве a.
Два массива нужно, чтобы сгенерированные random'ом числа не повторялись. Массив b содержит случайные
неповторяющиеся числа, а массив a - по 2 таких же, но расположенные случайным образом.