所以我的挑战是制作一个MxM零点矩阵,但其中大约15%的值为1。所有这些1的“总和”需要尽可能接近15%,同时也使它成为一个另一个函数的全局变量,但由于某种原因,它有时会陷入无限循环。有谁知道为什么会这样?
function [ board ] = randomking1( a,b )
clc
global sum
sum = 0; %initalizes sum to zero
kings = ceil(0.15*a*b); %finds number of kings needed for board size
board = randi([0,1],a,b); %creates game board of random zeros and ones.
% ones being the kings on the board.
for I = 1:a
for J = 1:b
if board(I,J) == 1
sum = sum + 1; %this set of for loops counts the
%number of kings on the board
end
end
end
while sum > kings || sum < kings-1 %if number of kings on the board is greater than
%number needed, the number of ones is reduced.
for I = 1:a
for J = 1:b
if sum
if board(I,J) == 1 %if a board value =1
board(I,J) = randi([0,1],1) %randomize 0 or 1
if board(I,J) == 0 %if the value becomes zero, subtract from the sum
sum = sum - 1
end
end
end
end
end
disp(sum)
end
答案 0 :(得分:2)
我建议不要试图使用你的暴力方法找到解决方案,而是建议在董事会中放置15%的国王,然后将其随机化。
function [ board ] = randomking1( a,b )
board_size = a*b;
% finds number of kings needed for board size
kings = ceil(0.15*board_size);
% creates game board (as a linear vector) of ones and zeros
% ones being the kings on the board.
board = [ones(1,kings), zeros(1, board_size-kings)];
% shuffle the board
board = board(randperm(board_size));
% create the a x b matrix out of the linear vector
board = reshape(board,[a,b]);
end
示例运行:randomking1(3,3)
:
board_size =
9
kings =
2
board =
1 1 0 0 0 0 0 0 0
board =
0 1 0 0 0 1 0 0 0
board =
0 0 0
1 0 0
0 1 0