Re: [問題] 產生一個特殊的矩陣已回收
我也找不到那篇了
不過我那時候有寫一個程式
就是一直跑迴圈try
不過只能跑到20X20 在上去就幾乎跑不出來了
可以參考看看
程式的主要流程
1) 先產生第一行依照距離亂數產生3個1
假設SIZE是15的話,位置1到5亂數產生1、位置6到10亂數產生1、距離11到15亂數產生1
這個做主要是防止數字擠在一起,例如:位置1到5裡面產生3個1,這種情況下
很有可能產生的矩陣不是所要的,所以要避免這種情形
2) 然後換第一列,如果已經有1,就依照距離亂數產生2個1;沒有就產生3個1
3) 再換第二行,以此類推。然後期間會去檢查剩下的位置夠不夠產生1
還是某一行列的1已經超過3個了
下面是程式碼
%主程式
%function genans
SIZE = 20; %矩陣大小 SIZE X SIZE
iteration = 10000; %迴圈次數
for n = 1:iteration
[out,correct] = genmatrix(SIZE);
if(correct == 0) %0表示跑出來的結果是對的 1或2都是錯誤的
break;
end
end
%副程式一
function [out,correct] = genmatrix(SIZE)
out = zeros(SIZE,SIZE);
correct = 0;
for n = 1:SIZE
numberone = sum(out(:,n));
if(SIZE-n+1<3-numberone)
correct = 1;
break;
end
if(numberone<3)
out(n:SIZE,n) = genrand(SIZE-n+1,3-numberone);
end
numberone = sum(out(n,:));
if(SIZE-n<3-numberone)
correct = 1;
break;
end
if(numberone<3)
out(n,n+1:SIZE) = genrand(SIZE-n,3-numberone);
elseif(numberone>3)
correct = 2;
break;
end
end
%副程式二
function out = genrand(len,number)
nround = round(len/number);
out = zeros(1,len);
location = zeros(1,number);
if number==1
location(1) = randint(1,1,[1,len]);
elseif number==2
location(1) = randint(1,1,[1,nround]);
location(2) = randint(1,1,[nround+1,len]);
else
location(1) = randint(1,1,[1,nround]);
location(2) = randint(1,1,[nround+1,2*nround]);
location(3) = randint(1,1,[2*nround+1,len]);
end
out(location) = 1;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.207.32
推
04/28 17:07, , 1F
04/28 17:07, 1F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):
問題
1
3