package org.andengine.util;
import java.util.ArrayList;
import org.andengine.util.adt.array.ArrayUtils;
import org.andengine.util.math.MathUtils;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 16:54:24 - 07.11.2010
*/
public class ProbabilityGenerator<T> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private float mProbabilitySum;
private final ArrayList<Entry<T>> mEntries = new ArrayList<Entry<T>>();
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public void add(final float pFactor, final T ... pElements){
this.mProbabilitySum += pFactor;
this.mEntries.add(new Entry<T>(pFactor, pElements));
}
public T next() {
float random = MathUtils.random(0, this.mProbabilitySum);
final ArrayList<Entry<T>> factors = this.mEntries;
for(int i = factors.size() - 1; i >= 0; i--){
final Entry<T> entry = factors.get(i);
random -= entry.mFactor;
if(random <= 0){
return entry.getReturnValue();
}
}
final Entry<T> lastEntry = factors.get(factors.size() - 1);
return lastEntry.getReturnValue();
}
public void clear() {
this.mProbabilitySum = 0;
this.mEntries.clear();
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
private static class Entry<T> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
public final float mFactor;
public final T[] mData;
// ===========================================================
// Constructors
// ===========================================================
public Entry(final float pFactor, final T ... pData){
this.mFactor = pFactor;
this.mData = pData;
}
// ===========================================================
// Getter & Setter
// ===========================================================
public T getReturnValue() {
if(this.mData.length == 1){
return this.mData[0];
}else{
return ArrayUtils.random(mData);
}
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}
}