作者zanyking (遙遠的旅人)
看板java
標題Re: [問題] 亂數產生一個矩陣
時間Wed Mar 15 22:35:12 2006
※ 引述《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
1F:推 PsMonkey:除非過三十,不然不准感嘆老... (╯‵□′) ╯︵ ┴─┴ 03/15 22:45
2F:推 PsMonkey:其實,我是想說... z 大可以幫忙批改程式碼嗎? \囧/ 03/15 22:47