Как я создаю случайную шестнадцатеричную строку, которая представляет цвет?

Предполагая, что вы следуете проекту Spring Batch, аналогичному https://spring.io/guides/gs/batch-processing/ , тогда вы можете следовать различным правилам вокруг задания [111 ] перезапуск . Spring Batch будет отслеживать ход выполнения вашей работы (например, сколько фрагментов было зафиксировано), поэтому в случае сбоя вы можете возобновить работу с того места, где оно было остановлено.

Немного подробнее: таблицы метаданных Spring Batch отслеживают детали вашей работы, включая commit_count в каждом шаге. Эти данные сохраняются в вашей базе данных после завершения, поэтому данные о вашей работе будут доступны после перезагрузки даже после аварийного восстановления.

38
задан John Rasch 4 May 2009 в 20:14
поделиться

6 ответов

Самый простой способ - использовать String.Format и использовать шестнадцатеричный формат для аргумента.

var random = new Random();
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
121
ответ дан John Rasch 27 November 2019 в 02:59
поделиться

ИМО, чисто случайные цвета не могут быть предпочтительными, так как вам нужны цвета, которые различимы в человеческих глазах.

Что о предустановке количества цветов и выборе их случайным образом?

Возможно, вы могли бы найти лучшие ответы в некоторых библиотеках графиков с открытым исходным кодом.

16
ответ дан Canton 27 November 2019 в 02:59
поделиться

Ответ Самуила - лучший способ сделать это, просто убедитесь, что если вы генерируете цвета внутри цикла что вы не создаете новый объект Random каждый раз, потому что new Random () запускает генератор, используя системные часы. Ваш цикл будет работать быстрее, чем могут тикать часы, поэтому вы будете в конечном итоге генерировать несколько одинаковых цветов снова и снова, потому что random засевается с одним и тем же значением.

Это должно выглядеть как-то так:

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)));
}

вместо:

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 27 November 2019 в 02:59
поделиться

Хороший способ создать хороший набор цветов - определить их с использованием фиксированной насыщенности и яркости и изменить оттенок.

  1. Установите насыщенность и яркость на то, что вам нравится, скажем, 50% насыщенности и 90% яркости.
  2. Теперь разделите 360-градусный оттенок на желаемое количество различных цветов.
  3. Выберите цвета из HSV, используя этот интервал для оттенка, и фиксированные S и V.

Это дает хороший набор цветов. Все они выглядят так, как будто они из одного и того же «набора» - все пастельные, или все интенсивные, или все не совсем белые, что угодно. И довольно просто кодировать, если у вас есть Color.FromHSV ().

Возможно, он перестанет работать, когда вы получите слишком много цветов, хотя они будут неразличимы. Но, возможно, вы все равно получите эту проблему.

В псевдокоде:

12
ответ дан Greg 27 November 2019 в 02:59
поделиться
Random rand = new Random(); // specify a seed
int r = rand.Next(0x1000000); 
Console.WriteLine("#{0:X6}", r);
4
ответ дан Chris Doggett 27 November 2019 в 02:59
поделиться

I noticed that you (Rahkim) commented on Greg's post that you wish you could put his idea (keeping the saturation and value constant, and just varying the hue...a good idea) into code. You can! Or, rather, someone already has for you!

I found this blog post on Converting HSV to RGB colour using C#, and I'm sure there are more out there. You'll probably end up with a nicer suite of colors this way than by picking them totally randomly.

Additionally, of course, this method makes it simple to get a nice set of colors...since the Hue goes from 0-359, you could do something like set your Hue something like this:

Hue = (PreviousHue + 50) % 360;

(I picked 50 since it doesn't go into 360 evenly, so if you go beyond 360 you won't start repeating hues instantly. You'd have to toy around with the value to get an ideal separation depending on how many different colors you're expecting.)

This way you don't have to worry about the case where the code is randomly picking two colors that are super close to one another when there is still lots of unused "hue" space.

3
ответ дан Starfish 27 November 2019 в 02:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: