我已经创建了这段代码来生成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 (' ')
答案 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
唯一个数字。
功能:
randi
随机抽取N
整数。unique
。Nu
个Nu = N
=>退出函数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内置函数的文档: