Вы можете выбрать набор случайных цветов, которые хорошо смотрятся вместе, используя алгоритм color wheel . Вот связанный вопрос SO с руководствами по реализации или Google для многих других.
Вы можете использовать что-то вроде хеша ваших меток в качестве отправной точки на цветовом круге для обеспечения стабильности. Это также удовлетворяет требованиям 3. если у вас есть механизм переопределения, позволяющий утверждать, что конкретное значение хеш-метки должно соответствовать определенной начальной точке цветового круга.
EDIT:
Цветовое колесо позволяет выбрать одну исходную исходную точку (например, (хэш (A)% 360)) и убедиться, что два других цвета (B, C) являются «хорошими» при использовании вместе с A. B и C определяются О. Если позже вы сможете получить круговую диаграмму (B, Y, Z), B будет установлен как (hash (B)% 360) и будет отличаться от того, что было в случае (A, B, C).
Если вы можете произвольно смешивать метки на круговых диаграммах, ни один алгоритм не может гарантировать, что они всегда будут хорошо смотреться вместе. Вот простое доказательство:
Пусть A, B, C выбраны так, чтобы они хорошо выглядели вместе.
Теперь позвольте А появиться с произвольным цветом Z
Вы, конечно, можете выбрать какой-нибудь цвет для Z, так что A и Z будут конфликтовать.
Вы можете гарантировать только то, что определенный набор цветов будет хорошо смотреться вместе, и что при выборе одного и того же набора будут воспроизводиться одинаковые цвета.
Вы можете использовать хеш, например, первая метка в качестве начальной точки на колесе (хеш (A)) или вы можете объединить хеш (хеш (A) + 31 * хеш (B) + 31 * 31 * хеш (C)). Умножение на 31 (простое число) - это нечто из мира Java, которое помогает обеспечить лучшее математическое распределение при объединении нескольких хешей.