matlab - 如何调整此代码以便我可以输入我想要的运行次数并将每次运行存储在矩阵中?
问题描述
我已经创建了这段代码来生成一组彩票号码,但我试图让用户可以输入他们想要多少组(输入 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 (' ')
解决方案
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 内置函数的文档:
推荐阅读
- c - 从 sscanf 读取的数字为 0
- c++ - 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- drupal - 如何更新 hook_presave 上的实体翻译?
- python - 如何正确使用带有 C++ 的 tensorflow 从 YOLO 模型中获取输出?
- jquery - 使用 jQuery 删除和附加视口
- angular - 在材料表中搜索不适用于管道
- google-chrome - 如何在 gitlab-ci 中的 chrome 中执行角度飞镖测试
- eclipse - 在构建路径中找到多个 Scala 库
- vb.net - Email validation issue
- swift - Parse Server Sign In with Apple Object saving failed with JWT Expired Error Swift