Как генерировать случайные имена цветов в С#
Мне нужно генерировать случайные имена цветов, например. "Красный", "Белый" и т.д. Как я могу это сделать? Я могу генерировать случайный цвет следующим образом:
Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255),
randonGen.Next(255));
но мне нужны имена, и не все цвета, созданные таким образом, имеют известное имя.
Спасибо
Ответы
Ответ 1
Используйте 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);
Ответ 2
Возьмите случайное значение и перейдите из перечисления 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.
Ответ 3
Похоже, вам просто нужен случайный цвет из перечисления KnownColor.
Ответ 4
Игнорируйте тот факт, что вы находитесь за цветами - вам просто нужен список возможных значений, а затем выберите случайное значение из этого списка.
Единственный сложный бит - это разработка набора цветов, который вам нужен. Как упоминал Пих, KnownColor
- или вы можете узнать все публичные статические свойства типа Color
в Color
и получить их имена. Это зависит от того, что вы пытаетесь сделать.
Обратите внимание, что сама случайность может быть немного неудобной - если вы выбираете несколько случайных цветов, вы, вероятно, захотите использовать один экземпляр Random`. К сожалению, он не является потокобезопасным, что делает вещи потенциально еще более сложными. Дополнительную информацию см. В статье о случайности.
Ответ 5
Или вы можете попробовать: для .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;
}
Ответ 6
Поместите цвета в массив, а затем выберите случайный индекс:
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
.
Ответ 7
Скопированный код из Получить список цветов на С#
CODE:
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;
}
Ответ 8
Я бы построил таблицу поиска. Тем более, что некоторые цвета соответствуют личной интерпретации.
Пройдите через каждое значение цвета в структуре Color (http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx) и сопоставьте его с значениями RGB. Затем, чтобы преобразовать назад, найдите значение RGB, чтобы увидеть, имеет ли он именованный цвет.
Ответ 9
Невозможно рандомизировать перечисление, как вы хотите сделать, наиболее подходящее решение пройдет, установив список со всеми значениями цветов, затем получите целочисленное рандомизирование и использование его в качестве индекса список.
Ответ 10
private string getRandColor()
{
Random rnd = new Random();
string hexOutput = String.Format("{0:X}", rnd.Next(0, 0xFFFFFF));
while (hexOutput.Length < 6)
hexOutput = "0" + hexOutput;
return "#" + hexOutput;
}
Ответ 11
Здесь я генерирую цвета на основе завершенного профиля.
public string generateColour(Decimal percentProfileComplete )
{
if(percent < 50)
{
return "#" + (0xff0000 | Convert.ToInt32(Convert.ToDouble(percentProfileComplete ) * 5.1) * 256).ToString("X6");
}
return "#" + (0xff00 | (255 - Convert.ToInt32((Convert.ToDouble(percentProfileComplete ) - 50) * 5.1)) * 256 * 256).ToString("X6");
}
Ответ 12
Я бы прокомментировал ответ Пиха; однако, недостаточно кармы. Anywho, я попытался реализовать это и столкнулся с проблемой того же цвета, который генерируется из нескольких вызовов, поскольку код вызывался многократно подряд (т.е. RandomGen был одним и тем же, и поскольку он основан на часах = аналогичные результаты).
Попробуйте это вместо:
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);
}
...
}
Ответ 13
Чтобы очистить синтаксические ошибки в исходном вопросе, это
Цвет .FromRgb и
(байт) random2.Next(255)
преобразует целое число в значение байта, необходимое для Color:
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));
Ответ 14
генерирует случайное число и отбрасывает его в KnownColor Type
((KnownColor)Random.Next());