Patch from Charlie to allow a Random object to be passed into many of the

pick methods.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@2455 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
samskivert
2008-10-20 16:07:29 +00:00
parent 6d7bfd6d7b
commit 39c9f7a499
+36 -9
View File
@@ -136,7 +136,7 @@ public class RandomUtil
return -1; return -1;
} }
int pick = getInt(sum, r); int pick = getInt(sum, r);
for (int ii=0, nn=weights.length; ii < nn; ii++) { for (int ii = 0, nn = weights.length; ii < nn; ii++) {
pick -= weights[ii]; pick -= weights[ii];
if (pick < 0) { if (pick < 0) {
return ii; return ii;
@@ -184,18 +184,18 @@ public class RandomUtil
public static int getWeightedIndex (float[] weights, Random r) public static int getWeightedIndex (float[] weights, Random r)
{ {
float sum = 0.0f; float sum = 0.0f;
for (int ii = 0; ii < weights.length; ii++) { for (float weight : weights) {
if (weights[ii] < 0.0f) { if (weight < 0.0f) {
return -1; return -1;
} }
sum += weights[ii]; sum += weight;
} }
if (sum <= 0.0) { if (sum <= 0.0) {
return -1; return -1;
} }
float pick = getFloat(sum, r); float pick = getFloat(sum, r);
for (int ii=0, nn=weights.length; ii < nn; ii++) { for (int ii = 0, nn = weights.length; ii < nn; ii++) {
pick -= weights[ii]; pick -= weights[ii];
if (pick < 0.0) { if (pick < 0.0) {
return ii; return ii;
@@ -214,8 +214,7 @@ public class RandomUtil
*/ */
public static <T> T pickRandom (T[] values) public static <T> T pickRandom (T[] values)
{ {
return (values == null || values.length == 0) ? null : return (values == null || values.length == 0) ? null : values[getInt(values.length)];
values[getInt(values.length)];
} }
/** /**
@@ -246,7 +245,17 @@ public class RandomUtil
*/ */
public static <T> T pickRandom (Collection<T> values) public static <T> T pickRandom (Collection<T> values)
{ {
return pickRandom(values.iterator(), values.size()); return pickRandom(values, rand);
}
/**
* Picks a random object from the supplied {@link Collection}.
*
* @param r the random number generator to use.
*/
public static <T> T pickRandom (Collection<T> values, Random r)
{
return pickRandom(values.iterator(), values.size(), r);
} }
/** /**
@@ -279,6 +288,8 @@ public class RandomUtil
* Picks a random object from the supplied List. The specified skip object will be skipped when * Picks a random object from the supplied List. The specified skip object will be skipped when
* selecting a random value. The skipped object must exist exactly once in the List. * selecting a random value. The skipped object must exist exactly once in the List.
* *
* @param r the random number generator to use.
*
* @return a randomly selected item. * @return a randomly selected item.
*/ */
public static <T> T pickRandom (List<T> values, T skip, Random r) public static <T> T pickRandom (List<T> values, T skip, Random r)
@@ -309,6 +320,22 @@ public class RandomUtil
* <code>count</code> elements. * <code>count</code> elements.
*/ */
public static <T> T pickRandom (Iterator<T> iter, int count) public static <T> T pickRandom (Iterator<T> iter, int count)
{
return pickRandom(iter, count, rand);
}
/**
* Picks a random object from the supplied iterator (which must iterate over exactly
* <code>count</code> objects using the given Random.
*
* @param r the random number generator to use.
*
* @return a randomly selected item.
*
* @exception NoSuchElementException thrown if the iterator provides fewer than
* <code>count</code> elements.
*/
public static <T> T pickRandom (Iterator<T> iter, int count, Random r)
{ {
if (count < 1) { if (count < 1) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@@ -316,7 +343,7 @@ public class RandomUtil
} }
T value = iter.next(); T value = iter.next();
for (int ii = 0, ll = getInt(count); ii < ll; ii++) { for (int ii = 0, ll = getInt(count, r); ii < ll; ii++) {
value = iter.next(); value = iter.next();
} }
return value; return value;