55 votes

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

Je dois 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 de cette manière n'ont pas un nom connu.

Merci

1 votes

Toutes les couleurs n'auront pas de nom. Elles sont trop nombreuses. Voulez-vous un nom de couleur "au mieux" ? Si c'est le cas, comment appelleriez-vous une couleur qui se situe exactement au milieu du bleu et du vert ?

93voto

Konrad Rudolph Points 231505

Utilice Enum.GetValue pour récupérer les valeurs des 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);

0 votes

Merci pour cela, ça marche comme sur des roulettes ! ...j'ai utilisé un panneau pour montrer la couleur

12voto

Pih Points 1641

Prenez une valeur aléatoire et obtenez-la de l'enum KnownColor.

Peut-être par ce moyen :

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.

4 votes

Copier le tableau est redondant.

0 votes

Idée, ça fait juste un randon de la KnowColor, désolé :-)

7voto

Jon Skeet Points 692016

Ignorez le fait que vous recherchez des couleurs - vous voulez simplement obtenir une liste de valeurs possibles, puis prendre une valeur aléatoire dans cette liste.

Le seul problème est de déterminer les couleurs que vous recherchez. Comme Pih l'a mentionné, il y a KnownColor - ou vous pouvez trouver toutes les propriétés statiques publiques de type Color au sein de la Color structure, et obtenir leurs noms. Ça dépend de ce que tu essaies de faire.

Notez que le hasard lui-même peut être un peu gênant - si vous sélectionnez plusieurs couleurs aléatoires, vous voudrez probablement utiliser une seule instance de Random`. Malheureusement, il 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.

5voto

David Points 65209

On dirait que vous avez juste besoin d'une couleur aléatoire parmi les Couleur connue l'énumération.

2voto

0xA3 Points 73439

Mettez les couleurs dans un tableau et choisissez ensuite un indice 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 de l'objet Color type. Vous pouvez améliorer ce résultat en vérifiant que le type de retour réel de la propriété est une propriété de type Color .

0 votes

Notez qu'en général, l'utilisation d'une variable statique pour Random est une mauvaise idée, car elle n'est pas sécurisée par les threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X