package matteroverdrive.starmap; import matteroverdrive.starmap.data.SpaceBody; import matteroverdrive.starmap.gen.ISpaceBodyGen; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Random; /** * Created by Simeon on 6/21/2015. */ public class WeightedRandomSpaceGen<T extends SpaceBody> { Random random; List<ISpaceBodyGen<T>> collection; public WeightedRandomSpaceGen(Random random) { collection = new ArrayList<ISpaceBodyGen<T>>(); this.random = random; } public ISpaceBodyGen<T> getRandomGen(T spaceBody) { return getRandomGen(collection,spaceBody,random); } public ISpaceBodyGen<T> getRandomGen(T spaceBody,Random random) { return getRandomGen(collection,spaceBody,random); } public ISpaceBodyGen<T> getRandomGen(Collection<ISpaceBodyGen<T>> collection,T spaceBody,Random rangomGen) { // Compute the total weight of all items together double totalWeight = 0.0d; for (ISpaceBodyGen<T> i : collection) { totalWeight += i.getWeight(spaceBody); } // Now choose a random item ISpaceBodyGen gen = null; double random = rangomGen.nextDouble() * totalWeight; for (ISpaceBodyGen<T> i : collection) { random -= i.getWeight(spaceBody); if (random <= 0.0d) { gen = i; break; } } return gen; } public ISpaceBodyGen<T> getGenAt(int index) { return collection.get(index); } public void addGen(ISpaceBodyGen<T> gen) { collection.add(gen); } public <K extends ISpaceBodyGen<T>> void addGens(Collection<K> gens) { collection.addAll(gens); } public List<ISpaceBodyGen<T>> getGens(){return collection;} }