Как генерировать случайные названия цветов в C # - PullRequest
47 голосов
/ 27 апреля 2011

Мне нужно создать случайные названия цветов, например, «Красный», «Белый» и т. Д. Как я могу это сделать? Я могу генерировать случайные цвета, как это:

Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255), 
randonGen.Next(255));

но мне нужны имена, и не все сгенерированные цвета имеют известное имя.

Спасибо

Ответы [ 14 ]

81 голосов
/ 27 апреля 2011

Используйте Enum.GetValue, чтобы получить значения перечисления KnownColor и получить случайное значение:

Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
11 голосов
/ 27 апреля 2011

Возьмите случайное значение и получите из перечисления KnownColor.

Может быть так:

System.Array colorsArray = Enum.GetValues(typeof(KnownColor));
KnownColor[] allColors = new KnownColor[colorsArray.Length];

Array.Copy(colorsArray, allColors, colorsArray.Length);
// get a randon position from the allColors and print its name.
6 голосов
/ 27 апреля 2011

Не обращайте внимания на тот факт, что вам нужны цвета - вам действительно нужен список возможных значений, а затем выберите случайное значение из этого списка.

Единственный сложный момент - определить, какой набор цветов вам нужен. Как упоминал Пих, существует KnownColor - или вы можете узнать все открытые статические свойства типа Color в структуре Color и получить их имена. Это зависит от того, что вы пытаетесь сделать.

Обратите внимание, что случайность сама по себе может быть немного неуклюжей - если вы выбираете несколько случайных цветов, вы, вероятно, захотите использовать один экземпляр Random`. К сожалению, это не потокобезопасно, что делает вещи потенциально еще более сложными. См. Мою статью о случайности для получения дополнительной информации.

5 голосов
/ 27 апреля 2011

Похоже, вам нужен случайный цвет из перечисления KnownColor .

2 голосов
/ 04 августа 2014

Или вы можете попробовать это: Для .NET 4.5

public Windows.UI.Color GetRandomColor()
{
            Random randonGen = new Random();
            Windows.UI.Color randomColor = 
                Windows.UI.Color.FromArgb(
                (byte)randonGen.Next(255), 
                (byte)randonGen.Next(255),
                (byte)randonGen.Next(255), 
                (byte)randonGen.Next(255));
            return randomColor;
}
2 голосов
/ 27 апреля 2011

Скопированный код из Получение списка цветов в C #

КОД:

private List<string> GetColors()
{
    //create a generic list of strings
    List<string> colors = new List<string>();
    //get the color names from the Known color enum
    string[] colorNames = Enum.GetNames(typeof(KnownColor));
    //iterate thru each string in the colorNames array
    foreach (string colorName in colorNames)
    {
        //cast the colorName into a KnownColor
        KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), colorName);
        //check if the knownColor variable is a System color
        if (knownColor > KnownColor.Transparent)
        {
            //add it to our list
            colors.Add(colorName);
        }
    }
    //return the color list
    return colors;
}
2 голосов
/ 27 апреля 2011

Поместите цвета в массив и затем выберите случайный индекс:

class RandomColorSelector
{
    static readonly Color[] Colors = 
        typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static)
       .Select(propInfo => propInfo.GetValue(null, null))
       .Cast<Color>()
       .ToArray();

    static readonly string[] ColorNames =  
        typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static)
        .Select(propInfo => propInfo.Name)
        .ToArray();

    private Random rand = new Random();

    static void Main(string[] args)
    {
        var colorSelector = new RandomColorSelector();
        var color = colorSelector.GetRandomColor();

        // in case you are only after the *name*
        var colorName = colorSelector.GetRandomColorName();            
    }

    public Color GetRandomColor()
    {
        return Colors[rand.Next(0, Colors.Length)];
    }

    public string GetRandomColorName()
    {
        return ColorNames[rand.Next(0, Colors.Length)];
    }
}

Обратите внимание, что в приведенном выше примере просто проверяются все статические свойства типа Color.Возможно, вы захотите улучшить это, проверив, что фактический тип возвращаемого свойства равен Color.

1 голос
/ 27 апреля 2011

Я бы создал таблицу поиска. Тем более что некоторые цвета зависят от личной интерпретации.

Просмотрите каждое значение цвета в структуре Color (http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx) и сопоставьте его со значениями RGB. Затем, чтобы преобразовать обратно, ищите значение RGB, чтобы увидеть, имеет ли оно названный цвет.

0 голосов
/ 13 декабря 2017

Чтобы очистить синтаксические ошибки в исходном вопросе, это

Color.FromRgb и

(байт) random2.Next (255)

преобразует целое число в значение байта, необходимое для цвета:

    Random random2 = new Random();
    public int nn = 0x128;
    public int ff = 0x512;
    Color randomColor = Color.FromRgb((Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff));
0 голосов
/ 25 февраля 2014

Я бы прокомментировал ответ Пиха;однако, недостаточно кармы.В любом случае, я попытался реализовать это и столкнулся с проблемой того, что один и тот же цвет генерировался из нескольких вызовов, так как код вызывался многократно в быстрой последовательности (т. Е. RandomGen был одним и тем же, и поскольку он основывался на получаемых одинаковых результатах clock =)

Попробуйте вместо этого:

public class cExample
{
    ...
    Random randomGen = new Random();
    KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
    ...
    private Color get_random_color()
    {
         KnownColor randomColorName = names[randomGen.Next(names.Length)];
         return Color.FromKnownColor(randomColorName);
    }
    ...
}
...