web-dev-qa-db-ja.com

色を表すランダムな16進文字列を作成するにはどうすればよいですか?

色に16進文字列が必要ないくつかのチャートを生成しています。

例:

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

これらを動的に作成しているので、各データシリーズの16進コードをランダムに生成したいと思います。

これを行う最良の方法は何ですか?

39
rahkim

最も簡単な方法は、String.Formatとし、引数には16進形式を使用します。

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

IMO、純粋にランダムな色は、人間の目で識別できる色が必要になるため、好ましくない場合があります。

いくつかの色をプリセットしてランダムに選択するのはどうですか?

おそらく、いくつかのオープンソースのグラフ作成ライブラリーでより良い答えを見つけることができます。

16
Canton

サミュエルの答えはこれを行うための最良の方法です。ループ内で色を生成する場合は、new Random()がシードされるため、毎回新しい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

素敵な色のセットを生成する良い方法は、固定の彩度と明るさを使用して色を定義し、色相を変えることです。

  1. 彩度と明るさを好きなものに設定します。たとえば、50%の彩度と90%の明るさです。
  2. ここで、360度の色相を必要な個別の色の数で割ります。
  3. その色相の間隔と固定されたSとVを使用してHSVから色を選択します。

これは素敵な色のセットを与え、それらはすべて同じ「セット」から来たように見えます-すべてパステル、またはすべて濃い、またはすべてオフホワイトです。また、Color.FromHSV()があれば、コーディングは非常に簡単です。

ただし、色が多すぎると機能しなくなる可能性がありますが、見分けがつかなくなります。しかし、とにかくその問題が発生するでしょう。

疑似コード:

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)

または

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

(私はリスト内包表記が好きです...)

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

あなた(ラーキム)がグレッグの投稿にコメントしたところ、彼のアイデア(彩度と値を一定に保ち、色相を変えるだけでよい...)をコードに入れてほしいと思いました。あなたはできる!または、誰かがすでにあなたのために持っています!

私はこのブログ投稿を C#を使用してHSVをRGBカラーに変換する で見つけました、そしてもっともっとそこにあると確信しています。完全にランダムに選択するよりも、この方法でより適切な色のスイートが得られるでしょう。

さらに、もちろん、この方法では色のニースセットを簡単に取得できます...色相は0〜359なので、次のように色相を設定することができます。

Hue = (PreviousHue + 50) % 360;

(360に均等に入らないので50を選択しました。360を超えると、色相がすぐに繰り返されなくなります。色の数に応じて理想的な分離を得るには、値をいじる必要があります。あなたが期待している。)

この方法では、未使用の「色相」スペースがまだたくさんあるときに、コードが互いに非常に近い2つの色をランダムに選択する場合について心配する必要はありません。

3
Beska