Вам нужен не случайный цвет, а детерминированное (возможно, нелинейное) отображение значений на цвета.Вместо использования random, почему бы не использовать другой алгоритм для преобразования значений в индекс, но нелинейным способом.
protected static string RandomColor(int metaDataId, int operationId, int dataType)
{
var names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
metaDataId = Math.Abs(metaDataId);
operationId = Math.Abs(operationId);
dataType = Math.Abs(dataType);
// compute a hash of the 3 values modulo the number of colors
unchecked
{
var index = (17 + metaDataId * 23 + operationId * 23 + dataType * 23) % names.Length;
}
Color color;
while (true)
{
var colorName = names[index];
color = Color.FromKnownColor(randomColorName);
var brightness = randomColor.GetBrightness();
if (brightness < 0.7 && brightness > 0.2)
{
break;
}
++index;
}
return ColorTranslator.ToHtml(color);
}