Re: [問題] 亂數產生一個矩陣

看板java作者 (遙遠的旅人)時間18年前 (2006/03/15 21:46), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串13/15 (看更多)
※ 引述《AI3767 (AI3767)》之銘言: : 嗯...這裡其實, 在setProbArray的方法裡, 並不會將probArr指向另一個值 : 因為實作上, 是將probArr做了累積計算放到probabilityArray裡 : 為的是在取亂數時較為簡易快速 : 雖然在建構時做了assign的動作, 但在setProbArray裡, : 會重新assign新的陣列, 這樣不會改動到原 probArr : 而且在物件建出後, 還可以重新設定新的機率, 但是得和原範圍數量相等 : 例如 probArr為{0.2f,0.7f,0.1f}則在setProbArray裡 : 會將probabilityArray={0.2f, 0.9f, 1.0f} : 本來是想將 set 的方法都private掉, 避免誤用 : 但想說至少 protected 的話, 還有機會被override掉, 如果不滿意的話 ^^ 是的,我知道probArr是先指向傳入的陣列等到第一個set方法時可以用來比較長度。 所以我才會覺得,這不是一個好方法。 你應該要直接比較建構子傳入的兩個陣列長度是否相同,而不是之後才在set方法中比。 而且,如果建構子中會呼叫class本身的非static 也非private方法的話,就物件設計 來看是很危險的: 1.拿去用的人通常很難正確的修改protected方法。 2.在一個多型的架構中你是無法猜測物件是如何被建構的。而現在,你的物件不但不 知道如何被建構,還有可能在初始化時跟某個不知何時被override掉的方法交配出 更加未知的物件。 3.如果你的建構子複雜到必須用一堆方法來結構他...寫一個Helper當傳入參數吧。 所以,還是照你一開始說的,避免誤用比較好吧。 與其override,不如丟一個新的Helper進去改變他的行為。 JAVA OOP裡有句名言(不可考): "除了實做介面外,通常會被override掉的方法只存在在Object裡。" : 若是直接給定的話, 的確是難用的, 我的設想是在 : 使用者應該會去維護一個範圍array,如rArr,以及對映的機率array,如pArr : 然後在要用時, 才去createRangeRandom(rArr,0,pArr) : 而上面您給的例子, 可以是 : int[] rangs = {4, 1, 1}; : float probs = {0.4f, 0.2f, 0.3}; //其實會exception, 因為總和不為1.0f 所以你知道有多難用了...我有檢查過可是還是miss掉了。 人老了,唉~~~ 傳入的rangs我覺得如果要解釋給User聽...大概User會先把我幹掉。 可以的話,不要傳機率進來,直接傳純量的int權重值。 我之前在寫我的curve版時之所以不用機率(最後才算),是因為考慮可能有捨位 誤差的問題在,所以可以避開float、double我都會盡可能避開,直到最後關頭 才用它。 權重陣列也是一樣的而且更方便,你可以: /** *宣布誰中X * */ target = new string[]{"qrrt1","godfat","AI3767","zanyking","psmonkey"}; weight = new int[]{1,2,3,4,5};//中X機率是.... sumWeight = new int[]{1,3,6,10,15};//算出來的累加權陣 int randInt = random.getInt(15);//命運的一刻 for(int i=0;i<target.length;i++) { if(randInt<=sumWeight[i]) { System.out.println("The Winner is:"+target[i]);//宣布中X人 break; } } 感覺會更直觀,詳細作法請trace我的source code。 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.85.116.116

03/15 22:45, , 1F
除非過三十,不然不准感嘆老... (╯‵□′) ╯︵ ┴─┴
03/15 22:45, 1F

03/15 22:47, , 2F
其實,我是想說... z 大可以幫忙批改程式碼嗎? \囧/
03/15 22:47, 2F
文章代碼(AID): #1461guY2 (java)
討論串 (同標題文章)
文章代碼(AID): #1461guY2 (java)