From 4e4d470626087c26ee18f5cb04c86647b5f2699c Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Tue, 29 Sep 2015 13:35:50 -0400 Subject: Added random grammar support. Import of library code from version 1 finished. Now for more library code and examples on library usage. --- .../main/java/bjc/utils/gen/WeightedRandom.java | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/gen/WeightedRandom.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/gen/WeightedRandom.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedRandom.java b/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedRandom.java new file mode 100644 index 0000000..ecd4e36 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedRandom.java @@ -0,0 +1,68 @@ +package bjc.utils.gen; + +import java.util.Random; + +import bjc.utils.funcdata.FunctionalList; +import bjc.utils.data.GenHolder; + +/** + * Represents a random number generator where certain results are weighted more heavily than + * others. + * @author ben + * + * @param The type of values that are randomly selected. + */ +public class WeightedRandom { + private Random src; + + private FunctionalList probs; + private FunctionalList results; + + private int totalChance; + + /** + * Create a new weighted random generator with the specified source of randomness + * @param sr The source of randomness to use. + */ + public WeightedRandom(Random sr) { + probs = new FunctionalList<>(); + results = new FunctionalList<>(); + + src = sr; + } + + /** + * Add a probability for a specific result to be given. + * @param chance The chance to get this result. + * @param res The result to get when the chance comes up. + */ + public void addProb(int chance, E res) { + probs.add(chance); + results.add(res); + + totalChance += chance; + } + + /** + * Generate a weighted random value. + * @return A random value selected in a weighted fashion. + */ + public E genVal() { + GenHolder v = new GenHolder<>(src.nextInt(totalChance)); + GenHolder res = new GenHolder(); + GenHolder bl = new GenHolder<>(true); + + probs.forEachIndexed((i, p) -> { + if (bl.held) { + if (v.held < p) { + res.held = results.getByIndex(i); + bl.held = false; + } else { + v.held -= p; + } + } + }); + + return res.held; + } +} -- cgit v1.2.3