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

看板java作者 (遙遠的旅人)時間18年前 (2006/03/12 04:33), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串7/15 (看更多)
之前好像有看過類似的問題...可以參考一下。 文章網址如下: http://www.javaworld.com.tw/jute/post/view?bid=29&id=141413&sty=1 如果眼睛不嫌累的話,就看以下的程式碼吧。 _________________________________________________________________ package test; public class DiscreteProcessor { protected int X1; protected int X2; protected int[] arr; /** * 設定曲線方程式跟區間(x1,x2) * @param fomula * @param X1 * @param X2 */ public void init(CurveFomula fomula,int X1,int X2) { this.X1 = X1; this.X2 = X2; arr = new int[X2-X1]; for (int i = 0, j = arr.length; i < j; i++) { int X = X1 + i;// 現在的X值 arr[i] = fomula.excute(X); // System.out.println("arr[" +i+ "]" + arr[i]); } } /** * 從X1開始,到X2結束,求算曲線積分值, * @return */ public long sigmaDiscrete() { long SUM = 0; for (int i = 0, j = arr.length; i < j; i++) SUM += arr[i]; return SUM; } /** * 取得符合該Fomula的整數離散數列,從X1開始,到X2結束 * @return */ public int[] getDiscreteSamples() { return arr; } /** * @param args */ public static void main(String[] args) { int x1 = 1; int x2 = 1001; int length = x2-x1; Ah_taiCurveFomula fomula1 = new Ah_taiCurveFomula(); DiscreteProcessor processor = new DiscreteProcessor(); processor.init(fomula1,x1,x2); int[] testData = new int[length];//測試統計結果 for (int i = 0, j = 1000000; i < j; i++) { int pickData = diceValue(processor.sigmaDiscrete(), processor.getDiscreteSamples());//多骰幾次,統計一下 testData[pickData]++; } for (int i = 0, j = length; i < j; i++) {// 試看看列印出來答案跟權陣的比例一不一樣? // System.out.println("ans[" + i + "]" + testData[i]); System.out.println(testData[i]); } } /** * Random出來一個參數,然後看他落在哪個權陣區間...燈燈燈,答案出來瞭 * * @param q * @param weightArr * @return */ public static int diceValue(long SUM, int[] weightArr) { double total = Math.random() * SUM; int temp = 0; for (int i = 0, j = weightArr.length; i < j; i++) { temp += weightArr[i]; if (total <= temp) { return i; } } return -1;// an fatal Error!!! } } interface CurveFomula { /** * Y = f(x),輸入X,求Y,直接叫f of x太難聽. * @param X * @return f(X) */ int excute(int X); } /** * @author Ian *一個CurveFomula的實作,你也可以實作自己的 */ class MyCurveFomula implements CurveFomula { public int excute(int X) { return (int) Math.floor(700000 / X); } } /** * * @author Ian *一個CurveFomula的實作,用你給的方程式 */ class Ah_taiCurveFomula implements CurveFomula { /** * y=1/400 * e ^ ((-1/400)*x) * */ public int excute(int X) { return (int) Math.floor(Math.pow(Math.E,((-1d/400d)*X))*100000d/400d) ; } } ___________________________________________________________________________ 原理是這樣的: 你先開一個地址存放陣列addressArr: int[] addressArr = new int[]{1,2,3}; 然後開一個權重存放矩陣weightArr: int[] weightArr = new int[]{9,5,1}; 再來,亂數產生器產生從 [min ~ SUM(min~max)] 中的任一亂數X。 int address = -1; int sum = 0; for(int i=0;i<weightArr.length;i++) { sum += weightArr[i]; if(X<sum) { address = i; break; } } 這時候,addressArr[X]就是你要的答案。 雖然JAVA沒有指標,你還是可以開陣列去模擬這樣的概念。 隨機產生出來的大量亂數在統計上就會服從你給的曲線分佈。 不曉得能不能解決問題? PS:to 版主,kkcity跟這裏好像已經Async了... -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.85.116.116
文章代碼(AID): #144pG3HZ (java)
討論串 (同標題文章)
文章代碼(AID): #144pG3HZ (java)