Re: [問題] 亂數產生一個矩陣
之前好像有看過類似的問題...可以參考一下。
文章網址如下:
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
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章