Search code examples
c#.netrandomcolorssystem.drawing

Calculate Random color with method parameters


I have method, for generating random colors. This method has 3 parameters and result color should be equal, if passed parameters are equal. Please, help me to find formula (some expression) for calculate random color.

 protected static string RandomColor(int metaDataId, int operationId, int dataType)
        {
            var names = (KnownColor[])Enum.GetValues(typeof(KnownColor));

            metaDataId = Math.Abs(metaDataId); // metaDataId = {1...N}
            operationId = Math.Abs(operationId);// operationId = {1...N}
            dataType = Math.Abs(dataType);// dataType = {1..6}

            var colorsCount = names.Length;
            var seed = /* some operations for generating Random color */;
            var randomGen = new Random(seed);

            Color randomColor;
            while (true)
            {
                var randomColorName = names[randomGen.Next(names.Length)];
                randomColor = Color.FromKnownColor(randomColorName);
                var brightness = randomColor.GetBrightness();
                if (brightness < 0.7 && brightness > 0.2)
                {
                    break;
                }
            }
            return ColorTranslator.ToHtml(randomColor);
        }

Solution

  • You don't want a random color, but a deterministic (probably nonlinear) mapping from values to colors. Rather than use random, why not use another algorithm to transform the values into a index, but in a nonlinear fashion.

    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);
    }