web-dev-qa-db-fra.com

Comment créer une chaîne hexadécimale aléatoire qui représente une couleur?

Je génère des graphiques qui nécessitent une chaîne hexadécimale pour les couleurs.

Exemple:

<dataseries name="ford" color="FF00FF" />

Je les crée dynamiquement, donc je voudrais générer le code hexadécimal pour chaque dataseries de manière aléatoire.

Quelle est la meilleure façon de procéder?

39
rahkim

Le moyen le plus simple consiste à utiliser String.Format et utilisez le format hexadécimal pour l'argument.

var random = new Random();
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
125
Samuel

OMI, les couleurs purement aléatoires peuvent ne pas être préférables car vous avez besoin de couleurs qui se distinguent aux yeux des humains.

Que diriez-vous de prérégler un certain nombre de couleurs et de les choisir au hasard?

Peut-être pourriez-vous trouver de meilleures réponses dans certaines bibliothèques de cartographie open source.

16
Canton

La réponse de Samuel est la meilleure façon de le faire, assurez-vous simplement que si vous générez les couleurs à l'intérieur d'une boucle, vous n'instanciez pas à chaque fois un nouvel objet Random parce que new Random() graines le générateur à l'aide de l'horloge système. Votre boucle va s'exécuter plus rapidement que l'horloge ne peut le faire, donc vous finirez par générer plusieurs des mêmes couleurs encore et encore parce que random est semé avec la même valeur.

Ça devrait ressembler a quelque chose comme ca:

int numColors = 10;
var colors = new List<string>();
var random = new Random(); // Make sure this is out of the loop!
for (int i = 0; i < numColors; i++) 
{
    colors.Add(String.Format("#{0:X6}", random.Next(0x1000000)));
}

au lieu de:

int numColors = 10;
var colors = new List<string>();
for (int i = 0; i < numColors; i++) 
{
    var random = new Random(); // Don't put this here!
    colors.Add(String.Format("#{0:X6}", random.Next(0x1000000)));
}
15
John Rasch

Un bon moyen de générer un bel ensemble de couleurs est de les définir en utilisant une saturation et une luminosité fixes et de faire varier la teinte.

  1. Réglez la saturation et la luminosité sur quelque chose que vous aimez, par exemple 50% de saturation et 90% de luminosité.
  2. Divisez maintenant les 360 degrés de teinte par le nombre de couleurs distinctes que vous souhaitez.
  3. Choisissez les couleurs de HSV en utilisant cet intervalle pour la teinte, et le S et V. fixes.

Cela vous donne un bel ensemble de couleurs, qui semblent toutes provenir du même `` ensemble '' - tout pastel, ou tout intense, ou tout blanc cassé, peu importe. Et il est assez facile de coder si vous avez Color.FromHSV ().

Cela cessera probablement de fonctionner une fois que vous aurez trop de couleurs, elles ne se distingueront pas. Mais vous aurez probablement ce problème de toute façon.

En pseudo code:

Sat = 0.5 * 255 //assuming we want range 0-255...
Brightness = 0.9 * 255
NumberOfColours = 7
HueSeparation = 360 / 7
Colors = []
for (i = 0 ; i< NumberOfColours; i++)
     Colors.Add(Color.FromHSV(HueSeparation * i, Sat, Brightness)

ou

n = 7
Colors = [Color.FromHSV(x*360/n, 128, 230) for x in range(n)]

(J'aime les listes de compréhension ...)

12
Greg
Random Rand = new Random(); // specify a seed
int r = Rand.Next(0x1000000); 
Console.WriteLine("#{0:X6}", r);
4
Chris Doggett

J'ai remarqué que vous (Rahkim) avez commenté sur le post de Greg que vous souhaitiez pouvoir mettre son idée (en gardant la saturation et la valeur constantes, et en variant simplement la teinte ... une bonne idée) dans le code. Vous pouvez! Ou plutôt, quelqu'un a déjà pour vous!

J'ai trouvé cet article de blog sur Conversion de HSV en couleur RVB en utilisant C # , et je suis sûr qu'il y en a plus. Vous vous retrouverez probablement avec une plus belle suite de couleurs de cette façon qu'en les choisissant de manière totalement aléatoire.

De plus, bien sûr, cette méthode facilite l'obtention d'un bel ensemble de couleurs ... puisque la teinte va de 0 à 359, vous pouvez faire quelque chose comme définir votre teinte quelque chose comme ceci:

Hue = (PreviousHue + 50) % 360;

(J'ai choisi 50 car il n'entre pas dans 360 uniformément, donc si vous allez au-delà de 360, vous ne commencerez pas à répéter les teintes instantanément. Vous devrez jouer avec la valeur pour obtenir une séparation idéale en fonction du nombre de couleurs différentes vous attendez.)

De cette façon, vous n'avez pas à vous soucier du cas où le code choisit au hasard deux couleurs qui sont très proches l'une de l'autre lorsqu'il y a encore beaucoup d'espace de "teinte" inutilisé.

3
Beska