diff --git a/src/java/com/threerings/cast/util/CastUtil.java b/src/java/com/threerings/cast/util/CastUtil.java
index 359b5fede..1b6b70a42 100644
--- a/src/java/com/threerings/cast/util/CastUtil.java
+++ b/src/java/com/threerings/cast/util/CastUtil.java
@@ -1,5 +1,5 @@
//
-// $Id: CastUtil.java,v 1.11 2004/08/27 02:12:29 mdb Exp $
+// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -25,7 +25,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import com.samskivert.util.CollectionUtil;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
import com.threerings.cast.CharacterDescriptor;
import com.threerings.cast.ComponentClass;
diff --git a/src/java/com/threerings/jme/model/Model.java b/src/java/com/threerings/jme/model/Model.java
index 5b002117c..052f7935a 100644
--- a/src/java/com/threerings/jme/model/Model.java
+++ b/src/java/com/threerings/jme/model/Model.java
@@ -41,8 +41,6 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Properties;
-import com.samskivert.util.ObserverList;
-
import com.jme.bounding.BoundingVolume;
import com.jme.math.FastMath;
import com.jme.math.Matrix4f;
@@ -54,7 +52,8 @@ import com.jme.scene.Controller;
import com.jme.scene.Node;
import com.jme.scene.Spatial;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.ObserverList;
+import com.samskivert.util.RandomUtil;
import com.threerings.jme.Log;
diff --git a/src/java/com/threerings/media/animation/BobbleAnimation.java b/src/java/com/threerings/media/animation/BobbleAnimation.java
index a4698f345..01c60a969 100644
--- a/src/java/com/threerings/media/animation/BobbleAnimation.java
+++ b/src/java/com/threerings/media/animation/BobbleAnimation.java
@@ -1,5 +1,5 @@
//
-// $Id: BobbleAnimation.java,v 1.8 2004/08/27 02:12:38 mdb Exp $
+// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -24,8 +24,8 @@ package com.threerings.media.animation;
import java.awt.Graphics2D;
import java.awt.Rectangle;
+import com.samskivert.util.RandomUtil;
import com.threerings.media.image.Mirage;
-import com.threerings.util.RandomUtil;
/**
* An animation that bobbles an image around within a specific horizontal
diff --git a/src/java/com/threerings/media/animation/ExplodeAnimation.java b/src/java/com/threerings/media/animation/ExplodeAnimation.java
index 65ebec107..7c3007433 100644
--- a/src/java/com/threerings/media/animation/ExplodeAnimation.java
+++ b/src/java/com/threerings/media/animation/ExplodeAnimation.java
@@ -1,5 +1,5 @@
//
-// $Id: ExplodeAnimation.java,v 1.16 2004/08/27 02:12:38 mdb Exp $
+// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -28,8 +28,8 @@ import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.StringUtil;
-import com.threerings.util.RandomUtil;
import com.threerings.media.image.Mirage;
diff --git a/src/java/com/threerings/media/animation/RainAnimation.java b/src/java/com/threerings/media/animation/RainAnimation.java
index 23fdbfe26..c3714de9f 100644
--- a/src/java/com/threerings/media/animation/RainAnimation.java
+++ b/src/java/com/threerings/media/animation/RainAnimation.java
@@ -1,5 +1,5 @@
//
-// $Id: RainAnimation.java,v 1.6 2004/08/27 02:12:38 mdb Exp $
+// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -25,7 +25,7 @@ import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
/**
* An animation that displays raindrops spattering across an image.
diff --git a/src/java/com/threerings/media/animation/SparkAnimation.java b/src/java/com/threerings/media/animation/SparkAnimation.java
index ac8969cce..8fcf1e49f 100644
--- a/src/java/com/threerings/media/animation/SparkAnimation.java
+++ b/src/java/com/threerings/media/animation/SparkAnimation.java
@@ -27,7 +27,7 @@ import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
import com.threerings.media.animation.Animation;
import com.threerings.media.image.Mirage;
diff --git a/src/java/com/threerings/media/image/ColorPository.java b/src/java/com/threerings/media/image/ColorPository.java
index 3c5edf6c3..bf56b74e0 100644
--- a/src/java/com/threerings/media/image/ColorPository.java
+++ b/src/java/com/threerings/media/image/ColorPository.java
@@ -33,12 +33,12 @@ import java.io.Serializable;
import java.text.ParseException;
import com.samskivert.util.HashIntMap;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.StringUtil;
import com.threerings.media.Log;
import com.threerings.resource.ResourceManager;
import com.threerings.util.CompiledConfig;
-import com.threerings.util.RandomUtil;
/**
* A repository of image recoloration information. It was called the
diff --git a/src/java/com/threerings/media/sound/MusicManager.java b/src/java/com/threerings/media/sound/MusicManager.java
index f9f3aa0b2..9149eed4a 100644
--- a/src/java/com/threerings/media/sound/MusicManager.java
+++ b/src/java/com/threerings/media/sound/MusicManager.java
@@ -25,10 +25,9 @@ import java.util.Iterator;
import java.util.LinkedList;
import com.samskivert.util.Config;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.RunQueue;
-import com.threerings.util.RandomUtil;
-
import com.threerings.media.Log;
/**
diff --git a/src/java/com/threerings/media/sound/SoundManager.java b/src/java/com/threerings/media/sound/SoundManager.java
index d27ff00af..967fc1bae 100644
--- a/src/java/com/threerings/media/sound/SoundManager.java
+++ b/src/java/com/threerings/media/sound/SoundManager.java
@@ -52,10 +52,10 @@ import com.samskivert.util.ConfigUtil;
import com.samskivert.util.Interval;
import com.samskivert.util.LRUHashMap;
import com.samskivert.util.Queue;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.StringUtil;
import com.threerings.resource.ResourceManager;
-import com.threerings.util.RandomUtil;
import com.threerings.media.Log;
import com.threerings.media.MediaPrefs;
diff --git a/src/java/com/threerings/media/util/BobblePath.java b/src/java/com/threerings/media/util/BobblePath.java
index a2996f706..c6282f66f 100644
--- a/src/java/com/threerings/media/util/BobblePath.java
+++ b/src/java/com/threerings/media/util/BobblePath.java
@@ -24,7 +24,7 @@ package com.threerings.media.util;
import java.awt.Color;
import java.awt.Graphics2D;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
import com.threerings.media.Log;
diff --git a/src/java/com/threerings/media/util/SmoothBobblePath.java b/src/java/com/threerings/media/util/SmoothBobblePath.java
index 35ac7c6bf..2ba20b560 100644
--- a/src/java/com/threerings/media/util/SmoothBobblePath.java
+++ b/src/java/com/threerings/media/util/SmoothBobblePath.java
@@ -21,7 +21,7 @@
package com.threerings.media.util;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
/**
* Bobble a Pathable smoothly.
diff --git a/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java b/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java
index 89cda766b..7e3e1e77e 100644
--- a/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java
+++ b/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java
@@ -26,10 +26,10 @@ import java.util.Arrays;
import com.samskivert.util.ArrayUtil;
import com.samskivert.util.Interval;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.StringUtil;
import com.threerings.util.Name;
-import com.threerings.util.RandomUtil;
import com.threerings.presents.data.ClientObject;
import com.threerings.presents.dobj.DObject;
diff --git a/src/java/com/threerings/parlor/turn/server/TurnGameManagerDelegate.java b/src/java/com/threerings/parlor/turn/server/TurnGameManagerDelegate.java
index b3d31d7da..8eee2003c 100644
--- a/src/java/com/threerings/parlor/turn/server/TurnGameManagerDelegate.java
+++ b/src/java/com/threerings/parlor/turn/server/TurnGameManagerDelegate.java
@@ -21,8 +21,8 @@
package com.threerings.parlor.turn.server;
+import com.samskivert.util.RandomUtil;
import com.threerings.util.Name;
-import com.threerings.util.RandomUtil;
import com.threerings.crowd.data.PlaceObject;
diff --git a/src/java/com/threerings/puzzle/server/PuzzleManager.java b/src/java/com/threerings/puzzle/server/PuzzleManager.java
index 1ece1d221..b357fd8c5 100644
--- a/src/java/com/threerings/puzzle/server/PuzzleManager.java
+++ b/src/java/com/threerings/puzzle/server/PuzzleManager.java
@@ -25,6 +25,7 @@ import java.util.Arrays;
import com.samskivert.util.IntListUtil;
import com.samskivert.util.Interval;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.StringUtil;
import com.threerings.presents.data.ClientObject;
@@ -39,7 +40,6 @@ import com.threerings.parlor.game.server.GameManager;
import com.threerings.util.MessageBundle;
import com.threerings.util.Name;
-import com.threerings.util.RandomUtil;
import com.threerings.puzzle.Log;
import com.threerings.puzzle.data.Board;
diff --git a/src/java/com/threerings/stage/tools/editor/EditorScenePanel.java b/src/java/com/threerings/stage/tools/editor/EditorScenePanel.java
index 969d727bb..72dada342 100644
--- a/src/java/com/threerings/stage/tools/editor/EditorScenePanel.java
+++ b/src/java/com/threerings/stage/tools/editor/EditorScenePanel.java
@@ -32,9 +32,9 @@ import javax.swing.event.ChangeListener;
import com.samskivert.swing.Controller;
import com.samskivert.swing.TGraphics2D;
import com.samskivert.swing.util.SwingUtil;
+import com.samskivert.util.RandomUtil;
import com.samskivert.util.StringUtil;
import com.threerings.util.DirectionCodes;
-import com.threerings.util.RandomUtil;
import com.threerings.media.tile.ObjectTile;
import com.threerings.media.tile.Tile;
diff --git a/src/java/com/threerings/stage/tools/viewer/ViewerScenePanel.java b/src/java/com/threerings/stage/tools/viewer/ViewerScenePanel.java
index eb0283ebd..cff786c2f 100644
--- a/src/java/com/threerings/stage/tools/viewer/ViewerScenePanel.java
+++ b/src/java/com/threerings/stage/tools/viewer/ViewerScenePanel.java
@@ -10,10 +10,10 @@ import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import com.samskivert.swing.Controller;
+import com.samskivert.util.RandomUtil;
import com.threerings.media.util.PerformanceMonitor;
import com.threerings.media.util.PerformanceObserver;
-import com.threerings.util.RandomUtil;
import com.threerings.cast.CharacterDescriptor;
import com.threerings.cast.CharacterManager;
diff --git a/src/java/com/threerings/util/RandomUtil.java b/src/java/com/threerings/util/RandomUtil.java
deleted file mode 100644
index 37f058c67..000000000
--- a/src/java/com/threerings/util/RandomUtil.java
+++ /dev/null
@@ -1,299 +0,0 @@
-//
-// $Id$
-//
-// Narya library - tools for developing networked games
-// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
-// http://www.threerings.net/code/narya/
-//
-// This library is free software; you can redistribute it and/or modify it
-// under the terms of the GNU Lesser General Public License as published
-// by the Free Software Foundation; either version 2.1 of the License, or
-// (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-package com.threerings.util;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-import com.samskivert.util.IntListUtil;
-
-/**
- * Provides miscellaneous utility routines to simplify obtaining
- * useful random number values and to centralize seeding and proper
- * care and feeding of the pseudo-random number generator.
- */
-public class RandomUtil
-{
- /** The random number generator used by the methods in this class. */
- public static final Random rand = new Random();
-
- /**
- * Returns a pseudorandom, uniformly distributed int
- * value between 0 (inclusive) and the specified value (exclusive).
- *
- * @param high the high value limiting the random number sought.
- */
- public static int getInt (int high)
- {
- return rand.nextInt(high);
- }
-
- /**
- * Returns a pseudorandom, uniformly distributed int
- * value between high and low, exclusive of each.
- */
- public static int getInt (int high, int low)
- {
- if (high - low - 1 <= 0) {
- throw new IllegalArgumentException(
- "Invalid range [high=" + high + ", low=" + low + "]");
- }
- return low + 1 + rand.nextInt(high - low - 1);
- }
-
- /**
- * Returns a pseudorandom, uniformly distributed float value between
- * 0.0 (inclusive) and the specified value (exclusive).
- *
- * @param high the high value limiting the random number sought.
- */
- public static float getFloat (float high)
- {
- return rand.nextFloat() * high;
- }
-
- /**
- * Pick a random index from the array, weighted by the value of the
- * corresponding array element.
- *
- * @param weights an array of non-negative integers.
- * @return an index into the array, or -1 if the sum of the weights
- * is less than 1.
- *
- * For example, passing in {1, 0, 3, 4} will return
- *
| 0 | 1/8th of the time |
- * | 1 | never |
- * | 2 | 3/8th of the time |
- * | 3 | half of the time |
- */
- public static int getWeightedIndex (int[] weights)
- {
- int sum = IntListUtil.sum(weights);
- if (sum < 1) {
- return -1;
- }
- int pick = getInt(sum);
- for (int ii=0, nn=weights.length; ii < nn; ii++) {
- pick -= weights[ii];
- if (pick < 0) {
- return ii;
- }
- }
-
- // Impossible!
- Log.logStackTrace(new Throwable());
- return 0;
- }
-
- /**
- * Pick a random index from the array, weighted by the value of the
- * corresponding array element.
- *
- * @param weights an array of non-negative floats.
- * @return an index into the array, or -1 if the sum of the weights
- * is less than or equal to 0.0 or any individual element is negative.
- *
- * For example, passing in {0.2, 0.0, 0.6, 0.8} will return
- * | 0 | 1/8th of the time |
- * | 1 | never |
- * | 2 | 3/8th of the time |
- * | 3 | half of the time |
- */
- public static int getWeightedIndex (float[] weights)
- {
- float sum = 0.0f;
- for (int ii = 0; ii < weights.length; ii++) {
- if (weights[ii] < 0.0f) {
- return -1;
- }
- sum += weights[ii];
- }
-
- if (sum <= 0.0) {
- return -1;
- }
- float pick = getFloat(sum);
- for (int ii=0, nn=weights.length; ii < nn; ii++) {
- pick -= weights[ii];
- if (pick < 0.0) {
- return ii;
- }
- }
-
- // Impossible!
- Log.logStackTrace(new Throwable());
- return 0;
- }
-
- /**
- * Picks a random object from the supplied array of values. Even
- * weight is given to all elements of the array.
- *
- * @return a randomly selected item or null if the array is null or of
- * length zero.
- */
- public static T pickRandom (T[] values)
- {
- return (values == null || values.length == 0) ? null :
- values[getInt(values.length)];
- }
-
- /**
- * Picks a random object from the supplied array of values, not
- * including the specified skip object as a possible selection
- * (equality with the skipped object is referential rather than via
- * {@link Object#equals}). The element to be skipped must exist in the
- * array exactly once. Even weight is given to all elements of the
- * array except the skipped element.
- *
- * @return a randomly selected item or null if the array is null, of
- * length zero or contains only the skip item.
- */
- public static T pickRandom (T[] values, T skip)
- {
- if (values == null || values.length < 2) {
- return null;
- }
- int index = getInt(values.length-1);
- for (int ii = 0; ii <= index; ii++) {
- if (values[ii] == skip) {
- index++;
- }
- }
- return (index >= values.length) ? null : values[index];
- }
-
- /**
- * Picks a random object from the supplied {@link Collection}.
- */
- public static T pickRandom (Collection values)
- {
- return pickRandom(values.iterator(), values.size());
- }
-
- /**
- * Picks a random object from the supplied List
- *
- * @return a randomly selected item.
- */
- public static T pickRandom (List values)
- {
- int size = values.size();
- if (size == 0) {
- throw new IllegalArgumentException(
- "Must have at least one element [size=" + size + "]");
- }
- return values.get(getInt(size));
- }
-
- /**
- * 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.
- *
- * @return a randomly selected item.
- */
- public static T pickRandom (List values, T skip)
- {
- return pickRandom(values, skip, rand);
- }
-
- /**
- * 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.
- *
- * @return a randomly selected item.
- */
- public static T pickRandom (List values, T skip, Random r)
- {
- int size = values.size();
- if (size < 2) {
- throw new IllegalArgumentException(
- "Must have at least two elements [size=" + size + "]");
- }
-
- int pick = r.nextInt(size - 1);
- for (int ii = 0; ii < size; ii++) {
- T val = values.get(ii);
- if ((val != skip) && (pick-- == 0)) {
- return val;
- }
- }
- return null;
- }
-
- /**
- * Picks a random object from the supplied iterator (which must
- * iterate over exactly count objects.
- *
- * @return a randomly selected item.
- *
- * @exception NoSuchElementException thrown if the iterator provides
- * fewer than count elements.
- */
- public static T pickRandom (Iterator iter, int count)
- {
- if (count < 1) {
- throw new IllegalArgumentException(
- "Must have at least one element [count=" + count + "]");
- }
-
- T value = iter.next();
- for (int ii = 0, ll = getInt(count); ii < ll; ii++) {
- value = iter.next();
- }
- return value;
- }
-
- /**
- * Picks a random object from the supplied iterator (which must
- * iterate over exactly count objects. The specified skip
- * object will be skipped when selecting a random value. The skipped
- * object must exist exactly once in the set of objects returned by
- * the iterator.
- *
- * @return a randomly selected item.
- *
- * @exception NoSuchElementException thrown if the iterator provides
- * fewer than count elements.
- */
- public static T pickRandom (Iterator iter, int count, T skip)
- {
- if (count < 2) {
- throw new IllegalArgumentException(
- "Must have at least two elements [count=" + count + "]");
- }
-
- int index = getInt(count-1);
- T value = null;
- do {
- value = iter.next();
- if (value == skip) {
- value = iter.next();
- }
- } while (index-- > 0);
- return value;
- }
-}
diff --git a/src/java/com/threerings/util/RobotPlayer.java b/src/java/com/threerings/util/RobotPlayer.java
index f550dc976..68b81c328 100644
--- a/src/java/com/threerings/util/RobotPlayer.java
+++ b/src/java/com/threerings/util/RobotPlayer.java
@@ -27,8 +27,7 @@ import java.util.ArrayList;
import com.samskivert.swing.Controller;
import com.samskivert.util.CollectionUtil;
import com.samskivert.util.Interval;
-
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
/**
* The robot player is a computer player with truly rudimentary artificial
diff --git a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java
index 71c7c365a..525f6798e 100644
--- a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java
+++ b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java
@@ -25,7 +25,7 @@ import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
-import com.threerings.util.RandomUtil;
+import com.samskivert.util.RandomUtil;
import com.threerings.cast.CharacterDescriptor;
import com.threerings.cast.CharacterManager;