1sem matlab 05
This commit is contained in:
parent
41d0b979d1
commit
018bac4688
5 changed files with 110 additions and 0 deletions
49
1sem/octave/05/gen_msg.m
Normal file
49
1sem/octave/05/gen_msg.m
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
% Программа генерации случайного сообщения в алфавите, содержащем не более 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue