Sniplet of RandomColor.java

//@author tjacobs

import java.awt.Color;
import java.util.ArrayList;
import java.util.Random;

public class RandomColor {

	public static final int CONTINUOUS = 0;
	public static final int RED = 0;
	public static final int GREEN = 1;
	public static final int BLUE = 2;

	private static final Color[] ROYGBV = new Color[] {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA};

	private int mSpots[] = new int [] {5, 5, 5};

	private float 	mRStart = 0, mGStart = 0, mBStart = 0,
					mRRange = 1, mGRange = 1, mBRange = 1;

	private ArrayList mBlockedColors;

	private Random mRandom = new Random(System.currentTimeMillis());

	public RandomColor() {}

	public RandomColor(	float r_start, float r_end,
						float g_start, float g_end,
						float b_start, float b_end) {
		setRedRange(r_start, r_end);
		setGreenRange(g_start, g_end);
		setBlueRange(b_start, b_end);
	}

	public void setRedRange(float start, float end) {
		mRStart = Math.min(start, end);
		mRRange = Math.abs(end - start);
	}

	public void setGreenRange(float start, float end) {
		mGStart = Math.min(start, end);
		mGRange = Math.abs(end - start);
	}

	public void setBlueRange(float start, float end) {
		mBStart = Math.min(start, end);
		mBRange = Math.abs(end - start);
	}

	public void setSpots(int RG_or_B, int spots) {
		switch (RG_or_B) {
		case RED : mSpots[RED] = spots; break;
		case GREEN : mSpots[GREEN] = spots; break;
		case BLUE : mSpots[BLUE] = spots; break;
		default : throw new RuntimeException("Illegal RG_or_B argument");
		}
	}

	public Color generateRandomColor() {
		Color c = null;
		if (mBlockedColors == null) mBlockedColors = new ArrayList(1);
		do {
			float r = generateRandomFloat(mRStart, mRRange, mSpots[RED]);
			float g = generateRandomFloat(mGStart, mGRange, mSpots[GREEN]);
			float b = generateRandomFloat(mBStart, mBRange, mSpots[BLUE]);
			c = new Color(r, g, b);
		} while (mBlockedColors.contains(c));
		return c;
	}

	private float generateRandomFloat(float start, float range, int spots) {
		if (spots == 1) return start + range;
		if (spots != CONTINUOUS) {
			int n = mRandom.nextInt(spots);
			return start + (range * (n / (float)(spots - 1)));
		}
		//continuous
		return start + mRandom.nextFloat() * range;
	}

	public void addColorBlocked(Color c) {
		if (mBlockedColors == null) {
			mBlockedColors = new ArrayList();
		}
		mBlockedColors.add(c);
	}

	public void removeColorBlocked(Color c) {
		mBlockedColors.remove(c);
	}

	public void setBlackBlocked(boolean b) {
		if (b) addColorBlocked(Color.BLACK);
			else removeColorBlocked(Color.BLACK);
	}

	public void setWhiteBlocked(boolean b) {
		if (b) addColorBlocked(Color.WHITE);
			else removeColorBlocked(Color.WHITE);
	}

	public Color getRandomROYGBV() {
		return ROYGBV[mRandom.nextInt(ROYGBV.length)];
	}

}