Хороший ответ от rinkert исправил ваши основные ошибки ( как попытка изменить итератор цикла i
из цикла => не работает ) и ответил на ваш вопрос о том, как хранить все ваши результаты.
Это оставило вас с рабочим кодом, однако я хотел бы предложить вам другой способ взглянуть на него.
Сложная архитектура состоит в том, чтобы разделить задачи на отдельные функции:
- Одна функция
draw_numbers
, которая может рисовать N
числа случайным образом (и делает только это)
- Одна функция
draw_lottery
, которая вызывает предыдущую функцию столько раз, сколько ей нужно (ваша n
), собирает результаты и отображает их.
draw_lottery
Эта архитектура имеет то преимущество, что значительно упрощает вашу основную функцию. Теперь это может быть так просто, как:
function Draws = draw_lottery(n)
% define your draw parameters
xmin = 1 ; % minimum number drawn
xmax = 69 ; % maximum number drawn
nballs = 5 ; % number of number to draw
% pre allocate results
Draws = zeros( n , nballs) ;
for iDraw=1:1:n
% draw "nballs" numbers
thisDraw = draw_numbers(xmin,xmax,nballs) ;
% add them to the result matrix
Draws(iDraw,:) = thisDraw ;
end
disp('The lotto numbers picked are:')
disp (Draws)
disp (' ')
end
draw_numbers
Вместо использования сложного набора условий if
и нескольких итераторов (i
/ m
/ k
) для ветвления потока программы я сделал функцию рекурсивной . Это означает, что функция может вызывать сама количество раз, пока условие не будет выполнено. В нашем случае условием является наличие набора nballs
уникальных номеров.
Функция:
- (1) рисует
N
целых чисел случайным образом, используя randi
.
- (2) удалить дубликаты номеров (если есть). Использование
unique
.
- (3) подсчитайте, сколько осталось уникальных чисел
Nu
- (4a), если
Nu = N
=> функция выхода
- (4b) if
Nu < N
=> Повторно позвоните, отправив существующие номера Nu
и попросив нарисовать дополнительные номера N-Nu
для добавления в коллекцию. Затем вернитесь к шагу (2).
в коде это выглядит так:
function draw = draw_numbers(xmin,xmax,nballs,drawn_set)
% check if we received a partial set
if nargin == 4
% if yes, adjust the number of balls to draw
n2draw = nballs - numel(drawn_set) ;
else
% if not, make a full draw
drawn_set = [] ;
n2draw = nballs ;
end
% draw "nballs" numbers between "xmin" and "xmax"
% and concatenate these new numbers with the partial set
d = [drawn_set , randi([xmin xmax],1,n2draw)] ;
% Remove duplicate
drawn_set = unique(d) ;
% check if we have some more balls to draw
if numel(drawn_set) < nballs
% draw some more balls
draw = draw_numbers(xmin,xmax,nballs,drawn_set) ;
else
% we're good to go, assign output and exit funtion
draw = drawn_set ;
end
end
Вы можете использовать обе функции в одном файле, если хотите.
Я рекомендую вам взглянуть на документацию нескольких используемых встроенных функций Matlab: