首页 > 解决方案 > 如何调整此代码以便我可以输入我想要的运行次数并将每次运行存储在矩阵中?

问题描述

我已经创建了这段代码来生成一组彩票号码,但我试图让用户可以输入他们想要多少组(输入 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 ('  ')

标签: matlabloopsfor-loopmatrix

解决方案


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) if 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 内置函数的文档:


推荐阅读