Re: [問題] 另一個亂數矩陣的問題

看板java作者 (遙遠的旅人)時間18年前 (2006/03/12 18:18), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/10 (看更多)
※ 引述《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)
文章代碼(AID): #144_M7gp (java)
討論串 (同標題文章)
文章代碼(AID): #144_M7gp (java)