作者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