Re: [問題] 另一個亂數矩陣的問題
※ 引述《oniki (宇治金時月見雪)》之銘言:
: 經版主這麼一提 好像還真的蠻難剛好等於平均值的@@"
: 我覺得應該是可以越接近mean的話越好 就是不要差太多
: 還有個問題是
: 關於設定min, max, mean的哲學
: 如果min, max設定完後 而所設定的mean太靠min或max
: 這樣產生出來的的矩陣的mean 應該會離mean很遠吧
: 所以 設定mean應該是要盡量取在min與max的中間
: 這樣要達到趨近於mean的機率 應該會比較高吧
其實,如果mean值一定必須得要是4的話,我覺得程式會更好寫。
因為,這樣你的題目就變成:
我有一個8 X 5矩陣,矩陣元素為[0~1],其中0 1必須各佔一半。
(平均值一定得要是四,那就表示01各佔一半。)
且每一row 0 or 1都在3~5個之內。
一種解法,就是先求1的每個row的[3,4,5]配方解。
總共有五個row,那麼考慮3 4 5這三個解元素:
1.一個row有4個1,沒有問題。但是若存在一個ROW只有3個1,那就必定有
一個row存在5個1來補。
2.五個ROW可以分成兩個ROW pair解跟一個單一ROW解,這個單一ROW解必定是四個1
3.兩個ROW pair解可以是 35配、53配、44配。
根據上述規則一個可行的虛擬碼:
________________________________________________________________________
int[][] ans = new int[5][];
int[][] possibleArr = new int[][]
{
{1,1,1,0,0,0,0,0},
{1,1,1,1,0,0,0,0},
{1,1,1,1,1,0,0,0}
}
int[] pair1 = createRowPair();//亂數產生一個數對,44 35 53三種可能
int[] pair2 = createRowPair();
//將二個數對跟一個必然解塞到rowAns裡頭(五個元素)。
int[] oneCount = int[]{4,pair1[0],pair1[1],pair2[0],pair2[1]};
oneCount = shuffle(oneCount);//寫一個簡單的攪拌器攪拌一下。
for(int i=oneCount.length;i>=0;i--)
{
ans[i] = shuffle(cloneArr(possibleArr[oneCount[i]-3]));
//位址運算...這行不好解釋。
}
return ans;//這就是答案拉~~
____________________________________________________________
createRowPair(),一個數對產生器。可能結果三選一
shuffle()。一個陣列攪拌器。就是把陣列攪拌一下
cloneArr()。一個陣列複製器。實作可以考慮system.arraycopy()
其實以上虛擬碼稍微修改一下,是可以擴展成:
1.M * N矩陣
2.[min~max]possible 0 1 count。min>=0,max<N
3.mean = X
這樣自由條件的。
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.85.116.116
※ 編輯: zanyking 來自: 210.85.116.116 (03/12 19:00)
※ 編輯: zanyking 來自: 210.85.116.116 (03/12 19:01)
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章