2015-04-19 3 views
0

, так что моя задача - создать матрицу нулей MxM, но с примерно 15% этих значений как 1. «Сумма» всех этих 1s должна быть как можно ближе к 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

"иногда"? который петля точно? для каких входных параметров он застревает? –

+0

Ну, иногда это работает и дает мне ответ, который я ищу, но каждый раз и время он просто бесконечно выводит 0 после 0 после 0 по вертикали. Я думаю, проблема может быть в цикле while. Если я вхожу в randomking1 (4,4), он выдает 3 или 4. Если я вхожу в randomking1 (5,5), он выдает 4 или 5. Но для всех этих входов случайным образом он застревает в цикле, иногда в первый раз я вхожу в него, иногда в пятый раз я запускаю его. – kaygoo

+0

Кажется, что вы чаще зацикливаетесь с более высокими числовыми матрицами, которые я вводил. – kaygoo

ответ

2

Вместо того, чтобы пытаться найти решение с помощью метода BruteForce, я предлагаю размещение 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 
+0

Сладкий! Спасибо вам, что это очень помогает в моем проекте! – kaygoo

Смежные вопросы