Как настроить этот код так, чтобы я мог ввести, сколько прогонов я хочу, и он будет хранить каждый прогон в матрице? - PullRequest
0 голосов
/ 25 апреля 2019

Я создал этот код для генерации 1 набора номеров лотереи, но я пытаюсь сделать так, чтобы пользователь мог ввести, сколько наборов он хочет (введите n), и он будет распечатан как одна длинная матрицаразмер nX6?Я возился с несколькими вариантами из онлайн-предложений, но безрезультатно.Я положил начальную для i = 1: 1: n в начале, но я не знаю, как сохранить каждый прогон в растущей матрице.Сейчас он все еще генерирует только 1 комплект.

function lottery(n)

for i=1:1:n
    xlow=1;
    xhigh=69;
    m=5;
    i=1;

    while (i<=m) 
        lottonum(i)=floor(xlow+rand*(xhigh-xlow+1));

        flag=0;
        for j=1:i-1
            if (lottonum(i)==lottonum(j)) 
                flag=1;
            end
        end
        if flag==0   
            i=i+1;
        end
    end

    ylow=1;
    yhigh=26;
    m=1;
    lottonum1=floor(ylow+rand*(yhigh-ylow+1));
    z = horzcat(lottonum, lottonum1);
end

disp('The lotto numbers picked are')
fprintf('%g ',z)
disp ('  ')

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Хороший ответ от 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:

0 голосов
/ 25 апреля 2019

Проблема в том, что вы не сохраняете и не отображаете вновь сгенерированные числа, а только последний набор. Чтобы решить эту проблему, инициализируйте z с помощью NaN или нулей, а затем индекс z, чтобы сохранить каждый набор в строке z, используя z(i,:) = lottonum.

Однако вы уже используете i в качестве итератора в цикле while, поэтому вам следует использовать другую переменную, например, k.

Вы также можете установить z в качестве выхода функции, чтобы вы могли использовать эту матрицу в какой-то другой части программы.

function z = lottery(n)
% init z
z = NaN(n,6);

for k = 1:n
    xlow=1;
    xhigh=69;
    m=5;
    i=1;
    while (i<=m) 
        lottonum(i)=floor(xlow+rand*(xhigh-xlow+1));
        flag=0;
        for j=1:i-1
            if (lottonum(i)==lottonum(j)) 
                flag=1;
            end
        end
        if flag==0   
            i=i+1;
        end
    end
    ylow=1;
    yhigh=26;
    lottonum1 = floor(ylow+rand*(yhigh-ylow+1));
    z(k,:) = horzcat(lottonum, lottonum1);  % put the numbers in a row of z
end

disp('The lotto numbers picked are')
disp(z)  % prettier display than fprintf in this case.
disp ('  ')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...