作者zanyking (遥远的旅人)
看板java
标题Re: [问题] 乱数产生一个矩阵
时间Sun Mar 12 04:38:56 2006
之前好像有看过类似的问题...可以参考一下。
文章网址如下:
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