web-dev-qa-db-fra.com

Comment générer des noms de couleurs aléatoires en C #

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

46
user579674

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);
81
Konrad Rudolph

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.
11
Pih

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.

6
Jon Skeet

On dirait que vous avez juste besoin d'une couleur aléatoire de KnownColor enumeration.

5
David

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.

2
Dirk Vollmar

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;
}
2
Javed Akram

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;
}
2
Vivek Saurav

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.

1
Max

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.

0
Amedio

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");
}
0
T Gupta

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));
0
pollaris

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);
    }
    ...
}
0
S. Arseneau
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;
        }
0
jon