如何调整此代码,以便可以输入所需的运行次数并将其存储在矩阵中?

时间:2019-04-25 01:58:07

标签: matlab loops for-loop matrix

我已经创建了这段代码来生成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 :(得分:0)

问题是您没有存储或显示新生成的数字,仅存储最后一组数字。要解决此问题,请使用NaN或零初始化z,然后再使用z将索引z存储在z(i,:) = lottonum行中。

但是,您已经在while循环中使用i作为迭代器,因此您应该使用另一个变量,例如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

答案 1 :(得分:0)

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)使用randi随机抽取N整数。
  • (2)删除重复的数字(如果有)。使用unique
  • (3)计算还剩多少Nu
  • (4a)如果Nu = N =>退出函数
  • (4b)如果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内置函数的文档: