作者zanyking (遥远的旅人)
看板java
标题Re: [问题] 另一个乱数矩阵的问题
时间Sun Mar 12 18:43:18 2006
※ 引述《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)