C# 如何随机获得不同于以前颜色的颜色?

C# 如何随机获得不同于以前颜色的颜色?,c#,C#,该程序目前正在用为其选择的颜色填写图表,一旦图表超过给定颜色的限制,它将随机选择一种颜色 有没有一种可行的方法可以在不与之前的颜色相同的情况下获得颜色 代码: public List<string> getColors(int columns) { List<string> colors = new List<string>(); colors.Add("\"rgba(77,77,77,0.8)\""); colors.Add("\"r

该程序目前正在用为其选择的颜色填写图表,一旦图表超过给定颜色的限制,它将随机选择一种颜色

有没有一种可行的方法可以在不与之前的颜色相同的情况下获得颜色

代码:

public List<string> getColors(int columns)
{
    List<string> colors = new List<string>();
    colors.Add("\"rgba(77,77,77,0.8)\"");
    colors.Add("\"rgba(241,88,84,0.8)\"");
    colors.Add("\"rgba(93,165,218,0.8)\"");
    colors.Add("\"rgba(96,189,104,0.8)\"");
    colors.Add("\"rgba(222,207,63,0.8)\"");
    colors.Add("\"rgba(178,118,178,0.8)\"");
    colors.Add("\"rgba(187,253,241,0.8)\"");
    colors.Add("\"rgba(178,145,47,0.8)\"");
    if (columns > colors.Count)
    {
        Color c = GetRandomColour();
        colors.Add(String.Format("\"rgba({0},{1},{2},0.8)\"", 
                   c.R.ToString(), c.G.ToString(), c.B.ToString()));
    }
    return colors;
}

private static readonly Random rand = new Random();

private Color GetRandomColour()
{
    return Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
}
public List getColors(int列)
{
列表颜色=新列表();
颜色。添加(“\”rgba(77,77,77,0.8)\”);
颜色。添加(“\”rgba(241,88,84,0.8)\”);
颜色。添加(“\”rgba(93165218,0.8)\”);
颜色。添加(“\”rgba(96189104,0.8)\”);
添加(“\”rgba(222207,63,0.8)\”);
颜色。添加(“\”rgba(178118178,0.8)\”);
颜色。添加(“\”rgba(187253241,0.8)\”);
颜色。添加(“\”rgba(178145,47,0.8)\”);
如果(列>颜色.计数)
{
颜色c=GetRandomColor();
Add(String.Format(“\”rgba({0},{1},{2},0.8)\”,
c、 R.ToString(),c.G.ToString(),c.B.ToString());
}
返回颜色;
}
private static readonly rand=new Random();
私有颜色GetRandomColor()
{
返回Color.FromArgb(rand.Next(256)、rand.Next(256)、rand.Next(256));
}

您可以实现类似的功能

public List<string> getColors(int columns)
    {
        List<string> colors = new List<string>();
        colors.Add("\"rgba(77,77,77,0.8)\"");
        colors.Add("\"rgba(241,88,84,0.8)\"");
        colors.Add("\"rgba(93,165,218,0.8)\"");
        colors.Add("\"rgba(96,189,104,0.8)\"");
        colors.Add("\"rgba(222,207,63,0.8)\"");
        colors.Add("\"rgba(178,118,178,0.8)\"");
        colors.Add("\"rgba(187,253,241,0.8)\"");
        colors.Add("\"rgba(178,145,47,0.8)\"");
        if (columns > colors.Count)
        {
            while (true)
            {
                Color c = GetRandomColour();
                string cs = String.Format("\"rgba({0},{1},{2},0.8)\"", c.R.ToString(), c.G.ToString(), c.B.ToString());
                if (!colors.Contains(cs))
                {
                    colors.Add(cs);
                    break;
                }
            }
        }
        return colors;
    }
public List getColors(int列)
{
列表颜色=新列表();
颜色。添加(“\”rgba(77,77,77,0.8)\”);
颜色。添加(“\”rgba(241,88,84,0.8)\”);
颜色。添加(“\”rgba(93165218,0.8)\”);
颜色。添加(“\”rgba(96189104,0.8)\”);
添加(“\”rgba(222207,63,0.8)\”);
颜色。添加(“\”rgba(178118178,0.8)\”);
颜色。添加(“\”rgba(187253241,0.8)\”);
颜色。添加(“\”rgba(178145,47,0.8)\”);
如果(列>颜色.计数)
{
while(true)
{
颜色c=GetRandomColor();
string cs=string.Format(“\”rgba({0},{1},{2},0.8)\”,c.R.ToString(),c.G.ToString(),c.B.ToString());
如果(!colors.Contains(cs))
{
颜色。添加(cs);
打破
}
}
}
返回颜色;
}

您可以在列表方法之外初始化颜色列表

List<string>colors = null
public List<string> getColors(int columns)
    {
        colors = new List<string>();

同样的颜色对你意味着什么?(100100100)与(100100101)是不同的色调吗?如果你想生成类似的颜色,我建议使用HSV调色板,因为你可以控制特定的变量,并且通过移动(色调只是一点点)生成类似的色调,再移动一点饱和度和暗色a用合适的颜色填充数组(不仅仅是你拥有的八种颜色,还要确保每种颜色与其他颜色完全不同),洗牌该数组,然后从该数组中选择它们。请参阅标记的重复以洗牌该数组。如果您只是尝试直接选择颜色,并将其与已选择的颜色进行比较,以确保没有重复或接近阴影,则将浪费大量CPU时间来选择颜色。如果您甚至不知道什么是dif如果有足够的阴影或如何生成具有足够不同阴影的颜色,那么您就有一个完整的其他问题,但其中一个问题太宽泛了。您需要更具体地说明问题中的约束和要求。请参阅其他标记的副本以获取灵感。事实上,它并不是我真正希望的副本在数组中执行。在任何情况下,我的意思是,我并不特别希望所选的随机颜色与前面的颜色非常相似。例如,我不希望在同一张图表中有两种相同的颜色和色调。
    private Color GetRandomColour()
    {
        Color coltemp = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
        while (colors.Contains(coltemp) 
        {
            coltemp = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
        }
        return coltemp;
    }