Cesar Bretana Gonzalez Ответов: 7

Как выбрать случайный цвет из системы.Рисование.Цвет?


Привет всем, мне нужен способ выбрать случайный цвет из
System.Drawing.Color 
- пожалуйста , кто-нибудь, помогите мне...

BillWoodruff

Похоже, что существуют различные интерпретации "случайного цвета из системы".Рисование.Цвет:" вы имеете в виду, что вам нужен любой возможный цвет; или вы хотите, чтобы случайный цвет был выбран из подмножества цветов, таких как те, которые находятся в перечислении KnownColor ?

7 Ответов

Рейтинг:
56

BillWoodruff

Предполагая, что вы хотите случайный выбор из известных цветов в системе.Рисование:

private List<knowncolor> colorList;
private Random rand;
private int maxColorIndex;

private KnownColor getRandomColor()
{
    return colorList[rand.Next(0, maxColorIndex)];
}

private TestRandomKnownColor()
{
    // conversion from IEnumerable necessary to use indexing

    // this list will include all Colors including OS system colors
    colorList = Enum.GetValues(typeof(KnownColor))
       .Cast<knowncolor>()
       .ToList();

    // if you want only the Microsoft named colors, like 'AliceBlue
    // and not the colors defined by the OS theme, like 'ActiveBorder
    // use this to build the list
    //colorList = Enum.GetValues(typeof(KnownColor))
        //.Cast<KnownColor>()
        //.Where(clr => ! (Color.FromKnownColor(clr).IsSystemColor))
        //.ToList();

    rand = new Random(DateTime.Now.Ticks.GetHashCode());

    maxColorIndex = colorList.Count();

    for (int i = 0; i < 10; i++)
    {
        KnownColor randColor = getRandomColor();
        Console.WriteLine(randColor);
    }
}


CPallini

Не знаю, почему кто-то понизил голос вашего решения, оно выглядит хорошим куском кода. У меня 5.

BillWoodruff

Спасибо!

Thomas Daniels

Хороший ответ, +5!

Рейтинг:
2

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Ваш ответ на Как генерировать случайные названия цветов в C#[^].


Sergey Alexandrovich Kryukov

"Случайный цвет" не следует понимать как "случайные цвета, взятые из некоторого набора", например именованные цвета.
Этот совет был бы хорош, если бы он был только дополнением к коду, генерирующему случайные значения цвета, как предполагает решение 2.
—СА

BillWoodruff

В этом случае OP специально хочет, чтобы цвета были взяты из набора цветов в системе.Рисование.Цвет :)

Sergey Alexandrovich Kryukov

Нет, может быть, вы неправильно поняли этот тип. Это набор цветов, все 256x256x256x256 (ARGB). Не путайте его с такими типами, как System.Рисование.Цвета, Система.Рисование.Система.Цвета, каждый из которых представляет подмножество значений цвета, представленных системой.Рисование.Цвет. Видите разницу? :-)
—СА

BillWoodruff

Вы абсолютно правы, Сергей, использование ОП "цвет" (единственное число) не оправдывает моего предположения, что подразумевалось только известное содержание перечисления цветов ! Хороший улов.

Sergey Alexandrovich Kryukov

:-)

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Вы правы. Не беспокойтесь. Все решения здесь. Пусть ОП решает, чего он хочет. Спасибо, что предупредил меня, как всегда. :)

Sergey Alexandrovich Kryukov

Именно так. Все решения представлены сейчас, и это главное здесь.
Спасибо за понимание.
—СА

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

:)

Рейтинг:
2

PIEBALDconsult

Есть еще кое-что, но над этим надо поработать.

public static class RandomColor
{
    private static readonly System.Random r ;
    private static readonly System.Reflection.PropertyInfo[] a ;

    static RandomColor
    (
    )
    {
        r = new System.Random() ;

        a = typeof(System.Drawing.Color).GetProperties ( System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static ) ;

        return ;
    }

    public static System.Drawing.Color
    Next
    (
    )
    {
        return ( (System.Drawing.Color) a [ r.Next ( a.Length ) ].GetValue ( null , null ) ) ;
    }
}


Рейтинг:
2

Afzaal Ahmad Zeeshan

Идея состоит в том, чтобы передать случайные значения самому цветовому объекту. Ниже приведена документация для класса Random.

http://msdn.microsoft.com/en-us/library/system.random(v=против 110).aspx[^]

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

Поскольку мы будем работать в диапазоне от 0 до 255, то вы будете использовать это свойство для случайного объекта, Next(int, int).

// create new instance
Random rand = new Random();
// would return between 0 - 255
int randomNumber = rand.Next(0, 255);


Теперь вы можете получить эти значения в трех различных переменных. Затем передайте их в качестве значений цветовому объекту. Подобный этому

// include namespaces
using System;
using System.Drawing;

// create new instance
Color color = new Color();
// set the values of RED, GREEN and BLUE
color.R = randRed;
color.G = randGreen;
color.B = randBlue;

// use the color here in the code
// as a Color object of System.Drawing namespace.


Cesar Bretana Gonzalez

Ну, спасибо всем за вашу помощь, все вы действительно помогаете мне, люди, еще раз спасибо...

Рейтинг:
1

CPallini

Простой способ получения непрозрачного цвета

Random rand = new Random();
int r = rand.Next(256);
int g = rand.Next(256);
int b = rand.Next(256);
Color col = Color.fromArgb(r,g,b);


Sergey Alexandrovich Kryukov

Тот же комментарий, что и мой комментарий к решению 2.
Некоторые два члена проголосовали за 2, вероятно, потому, что ваше решение повторяет уже имеющееся решение. Но я знаю, что вы не стали бы специально копировать чужое решение; скорее всего, это было совпадение, и пост перекрывался во времени; поэтому я проголосовал за свою 4-ю.
—СА

CPallini

:-) Я просто копирую себя. Спасибо.

Рейтинг:
1

Jan_Tamis

самый лучший и эффективный способ сделать это-это:

Random rng = new Random();

Color.FromArgb(rng.next(-16777216, 0);


это вернет случайный цвет с 255 в качестве альфа - значения;


Richard MacCutchan

Опоздал больше чем на три года. Пожалуйста, не воскрешайте старые ответы, особенно те, которые уже имеют решения.

Jan_Tamis

Ну, я нахожу ость неэффективной, поэтому я подумал, что опубликую лучшее решение.

Richard MacCutchan

Ваш ответ не лучше, на самом деле это довольно плохое предложение.

Jan_Tamis

Можете ли вы тогда сказать мне, почему это не лучший оунсер?

Рейтинг:
0

Thomas Daniels

Поскольку цвет имеет данные RGB и все значения (красный, зеленый и синий) являются целыми числами от 0 до 255 (включая 0 и 255), вы можете использовать Random класс для генерации трех целых чисел от 0 до 255.

Random rand = new Random();
int max = byte.MaxValue + 1; // 256
int r = rand.Next(max);
int g = rand.Next(max);
int b = rand.Next(max);
Color c = Color.FromArgb(r, g, b);

rand.Next(max); возвращает целое число от 0 до 255, но мы передаем max (= 256) в качестве аргумента, поскольку аргумент rand.Next это исключительная верхняя граница, поэтому, если мы используем здесь 256, она будет включать 255, но не 256.

Более подробная информация о компании Random.Next: http://msdn.microsoft.com/en-us/library/System-да.Случайные.Далее.aspx-файл[^]


Sergey Alexandrovich Kryukov

Используя любой непосредственные константы например, 256-это неприемлемо. Всегда лучше ввести явную константу (если не член, возможно, только для чтения или переменную).

В этом случае заменить "255" на "byte.MaxValue + 1".

Поэтому я проголосовал за него своими 4 голосами. :-)

—СА

Thomas Daniels

Спасибо за ваш комментарий! Я отредактировал свой ответ.

CPallini

Почему непосредственная константа-это мерзость?

Sergey Alexandrovich Kryukov

Я думал, что это должно быть очевидно для вас. Что делать, если вам нужно изменить его? Что, меняя его в 3 или более местах?
И в этом случае изменение вполне возможно. Возможно, потребуется ограничить диапазон цветов, код может потребоваться принять 16-битные цвета и так далее...
—СА

CPallini

Да, это действительно так. Это был просто глупый вопрос.

CPallini

Действительно не знаю, почему кто-то его понизил, так как он очень похож на идеальное решение (мое: - D ).
Серьезно, возьми мою пятерку.

Thomas Daniels

Спасибо! Я еще не видел вашего ответа (но теперь увидел), и я не понимаю, почему кто-то понизил ваш голос, так что вы тоже получили мои 5.