J'ai besoin de générer des noms de couleurs aléatoires, par exemple. "Rouge", "Blanc" etc. Comment puis-je le faire? Je suis capable de générer des couleurs aléatoires comme ceci:
Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255),
randonGen.Next(255));
mais j'ai besoin des noms et toutes les couleurs générées comme ceci n'ont pas un nom connu.
Merci
Utilisez Enum.GetValue
pour récupérer les valeurs de l'énumération KnownColor
et obtenir une valeur aléatoire:
Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
Prenez une valeur aléatoire et obtenez l'énumération KnownColor.
Peut-être par cette voie:
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.
Ignorez le fait que vous recherchez les couleurs - vous voulez simplement une liste de valeurs possibles, puis choisissez une valeur aléatoire dans cette liste.
Le seul problème qui se pose alors est de déterminer quel jeu de couleurs vous recherchez. Comme Pih l'a mentionné, il existe KnownColor
- ou vous pouvez trouver toutes les propriétés statiques publiques de type Color
dans la structure Color
et obtenir leurs noms. Cela dépend de ce que vous essayez de faire.
Notez que le caractère aléatoire lui-même peut être un peu gênant - si vous sélectionnez plusieurs couleurs aléatoires, vous souhaiterez probablement utiliser une seule instance de Random`. Malheureusement, ce n’est pas thread-safe, ce qui rend les choses potentiellement encore plus compliquées. Voir mon article sur le hasard pour plus d'informations.
On dirait que vous avez juste besoin d'une couleur aléatoire de KnownColor enumeration.
Placez les couleurs dans un tableau, puis choisissez un index aléatoire:
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)];
}
}
Notez que l'exemple ci-dessus recherche simplement toutes les propriétés statiques du type Color
. Vous voudrez peut-être améliorer cela en vérifiant que le type de retour réel de la propriété est un Color
.
Code copié de Récupère une liste de couleurs en C #
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;
}
Ou vous pouvez essayer ceci: Pour .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;
}
Je construirais une table de consultation. Surtout que certaines couleurs sont à l'interprétation personnelle.
Parcourez chaque valeur de couleur dans la structure Color ( http://msdn.Microsoft.com/en-us/library/system.drawing.color.aspx ) et associez-la aux valeurs RVB. Ensuite, pour reconvertir, recherchez la valeur RVB pour voir si elle a une couleur nommée.
Il n’existe aucun moyen de randomiser une énumération, comme vous le souhaitez; la solution la plus appropriée passerait par la définition d’une liste avec toutes les valeurs des couleurs, puis l’obtention d’un entier le randomisant et l’utilisant comme index de la liste.
Ici, je génère des couleurs en fonction du profil terminé.
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");
}
Pour effacer les erreurs de syntaxe dans la question initiale, il est
Color.FromRgb, et
(Octet) random2.Next (255)
convertit l'entier en une valeur d'octet requise par 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));
J'aurais commenté la réponse de Pih; Cependant, pas assez de karma. Quoiqu’il en soit, j’ai essayé d’implémenter cela et j’ai rencontré le problème de la même couleur générée à partir de plusieurs appels, le code étant appelé plusieurs fois de suite (c’est-à-dire que randomGen était identique et qu’il était basé sur l’horloge = résultats identiques).
Essayez ceci à la place:
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);
}
...
}
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;
}