UPC/1sem/octave/08/gen_msg.m
2019-12-17 00:29:33 +07:00

49 lines
2.2 KiB
Matlab
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% Программа генерации случайного сообщения в алфавите, содержащем не более 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