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數位生活區 即時熱門文章