% Программа генерации случайного сообщения в алфавите, содержащем не более 36 символов: 0, ..., 9, A, ..., Z.
% Автор: Кирилл Владимирович Пушкарёв.
% Дата: 26 октября 2019 г.
% Версия: 0.2
% Параметры:
% p - вектор, содержащий от 2 до 36 неотрицательных чисел.
%     Вероятности символов алфавита.
% len - целое число.
%     Длина сообщения.
function msg = gen_msg(p, len)
    % Создаём вектор символов алфавита 0, ..., 9, A, ..., Z
    alph = ['0':'9' 'A':'Z'];
    % Если p не вектор, ошибка
    if ~isvector(p)
        error('p must be a vector')
    end
    % Если длина вектора p больше длины alph, ошибка
    if length(p) > length(alph)
        % Выводим сообщение об ошибке, подставляя в него целые числа (%d) — длины векторов
        error('p is too long (%d > %d)', length(p), length(alph));
    end
    % Если длина вектора p меньше 2, ошибка
    if length(p) < 2
        error('p is too short (%d < 2)', length(p));
    end
    % Если длина не одно число, ошибка
    if ~isscalar(len)
        error('len must be a scalar')
    end
    % Если длина меньше 1, ошибка
    if len < 1
        error('len is too small (%d < 1)', len)
    end
    % Создаём пустую строку для записи сообщения
    msg = '';
    % Цикл по i от 1 до len
    for i = 1:len
        % Заносим случайно выбранный с заданными вероятностями символ в msg
        msg(i) = alph(rand_discr(p));
    end
end

% Функция генерации целого случайного числа i с вероятностью p(i).
% Параметры:
% p - вектор неотрицательных чисел, сумма элементов которого равна 1.
%     Вероятности.
function r = rand_discr(p)
    r = sum(cumsum(p) < rand()) + 1;
end
