From 8dfddc586f49b2d7ce4a4d712334a28584c0b315 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Sun, 3 Jun 2018 20:57:27 -0300 Subject: Efficency updates Change a few things to use more efficent implementations --- base/src/main/java/bjc/utils/data/Pair.java | 8 +++++ .../main/java/bjc/utils/gen/WeightedRandom.java | 36 ++++++++++------------ 2 files changed, 25 insertions(+), 19 deletions(-) (limited to 'base') diff --git a/base/src/main/java/bjc/utils/data/Pair.java b/base/src/main/java/bjc/utils/data/Pair.java index 40e4849..df7e199 100644 --- a/base/src/main/java/bjc/utils/data/Pair.java +++ b/base/src/main/java/bjc/utils/data/Pair.java @@ -102,6 +102,14 @@ public class Pair implements IPair { return String.format("Pair [leftValue='%s', rightValue='%s']", leftValue, rightValue); } + public LeftType getLeft() { + return leftValue; + } + + public RightType getRight() { + return rightValue; + } + @Override public int hashCode() { final int prime = 31; diff --git a/base/src/main/java/bjc/utils/gen/WeightedRandom.java b/base/src/main/java/bjc/utils/gen/WeightedRandom.java index be8b8c2..c7cee19 100644 --- a/base/src/main/java/bjc/utils/gen/WeightedRandom.java +++ b/base/src/main/java/bjc/utils/gen/WeightedRandom.java @@ -24,7 +24,7 @@ public class WeightedRandom { private final IList results; /* The source for any needed random numbers */ - private final Random source; + private Random source; /* The total chance for all values. */ private int totalChance; @@ -37,7 +37,7 @@ public class WeightedRandom { */ public WeightedRandom(final Random src) { probabilities = new FunctionalList<>(); - results = new FunctionalList<>(); + results = new FunctionalList<>(); if(src == null) throw new NullPointerException("Source of randomness must not be null"); @@ -66,25 +66,23 @@ public class WeightedRandom { * @return A random value selected in a weighted fashion. */ public E generateValue() { - final IHolder value = new Identity<>(source.nextInt(totalChance)); - final IHolder current = new Identity<>(); - final IHolder picked = new Identity<>(true); - - probabilities.forEachIndexed((index, probability) -> { - if(picked.unwrap(bool -> bool)) { - if(value.unwrap((number) -> number < probability)) { - current.transform((result) -> results.getByIndex(index)); - - picked.transform((bool) -> false); - } else { - value.transform((number) -> number - probability); - } - } - }); - - return current.unwrap((result) -> result); + return generateValue(source); } + public E generateValue(Random rn) { + int target = rn.nextInt(totalChance); + + int i = 0; + + for(int prob : probabilities) { + if(target <= prob) return results.getByIndex(i); + + target -= prob; + i += 1; + } + + throw new NullPointerException("Fell off the end of the results list"); + } /** * Return a list of values that can be generated by this generator * -- cgit v1.2.3