Re: [問題] 亂數產生一個矩陣
不好意思, 這個主題已經很久了
想說試著寫一個一般型的來試看看
下面有主要程式的程式碼, 寫的不好請見諒
作法很直觀, 就是看機率落在那個範圍
再從那個範圍內取亂數
主要由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)
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章