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

看板java作者 (AI3767)時間18年前 (2006/03/14 21:58), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串9/15 (看更多)
不好意思, 這個主題已經很久了 想說試著寫一個一般型的來試看看 下面有主要程式的程式碼, 寫的不好請見諒 作法很直觀, 就是看機率落在那個範圍 再從那個範圍內取亂數 主要由Factory method取得一個物件 然後這個物件就可以用getRand()來取值了 package tw.edu.ccu.cs.ailab; import java.util.Arrays; import java.util.Random; public class RangeRandom { private Random genRandom; private int[] accumulateArray; private int offset; private float[] probabilityArray; private RangeRandom(int[] rangeArr, int off, float[] probArr) { offset = off; probabilityArray = probArr; setAccumulateArray(rangeArr); setProbArray(probArr); genRandom = new Random(); } //{END constructor} /** 利用 <code>range</code> 陣列所設定的各個範圍大小, 相對同個索引位置的 * <code>probs</code> 陣列是該位置範圍的機率. <p> * 舉例當呼叫 <code>createRangeRandom(new int[]{1,3,2}, 2, * new float[]{0.2f,0.7f,0.1f})</code>,<br> * 則亂數產生 2 的機率有 20%; 3, 4, 或5 的機率有 70%; 6 或 7 的機率有 10%. * <p> * <code>probs<code> 機率陣列的機率和, 必須為 1.0f, 否則會丟出一個 * <code>RuntimeException</code> * @param range 存放各範圍大小的陣列 * @param offset 表示要產生亂數的起始值 * @param probs 存放各範圍機率的陣列 */ public static RangeRandom createRangeRandom(int[] range, int offset, float[] probs) { return new RangeRandom(range, offset, probs); } //{END factory} public static RangeRandom createRangeRandom() private int getCase() { int c = Arrays.binarySearch(probabilityArray, genRandom.nextFloat()); if( c<0 ) return -(++c); else return c; } //{END} private int getCase() public int getRand() { int caseRange = getCase(); if( caseRange==0 ) return offset+genRandom.nextInt(accumulateArray[0]-offset); else return accumulateArray[caseRange-1]+genRandom.nextInt( accumulateArray[caseRange]-accumulateArray[caseRange-1]); } //{END} public int getRand() protected void setProbArray(float[] probArr) { if( probArr.length!= accumulateArray.length ) throw new RuntimeException("Array size doesn't match."); float test = 0f; probabilityArray = new float[probArr.length]; for(int i=0; i<probArr.length; i++) { test += probArr[i]; probabilityArray[i] = test; } if( test!= 1.0f ) throw new RuntimeException("Probability doesn't equal to 1.0."); } //{END} protected void setProbArray() protected void setAccumulateArray(int[] rangeArr) { if( rangeArr.length!= probabilityArray.length ) throw new RuntimeException("Array size doesn't match."); int total = offset; accumulateArray = new int[rangeArr.length]; for(int i=0; i<rangeArr.length; i++) { total += rangeArr[i]; accumulateArray[i] = total; } } //{END} protected void setRangeArray() } //{END class} class RangeRandom -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.105.166 ※ 編輯: AI3767 來自: 140.123.105.166 (03/14 22:21)
文章代碼(AID): #145imGjO (java)
討論串 (同標題文章)
文章代碼(AID): #145imGjO (java)