ランダムな色名を生成する必要があります「赤」、「白」など。どうすればいいですか?私はこのようなランダムな色を生成することができます:
Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255),
randonGen.Next(255));
しかし、名前が必要であり、このように生成されるすべての色に既知の名前があるわけではありません。
ありがとう
つかいます Enum.GetValue
は、KnownColor
列挙の値を取得し、ランダムな値を取得します。
Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
ランダムな値を取得し、KnownColor列挙から取得します。
このようにすることができます:
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.
あなたが色を求めているという事実を無視してください-あなたは本当に可能な値のリストが本当に欲しいだけで、そのリストからランダムな値を取ります。
唯一の注意が必要なのは、どの色のセットを求めるかを決めることです。 Pihが述べたように、 KnownColor
-または Color
内のColor
型のすべてのパブリック静的プロパティを見つけることができます 構造、およびそれらの名前を取得します。それはあなたが何をしようとしているかに依存します。
ランダム性自体は少し厄介であることに注意してください-複数のランダムな色を選択している場合は、おそらくRandom`の単一のインスタンスを使用する必要があります。残念ながら、スレッドセーフではないため、事態はさらに複雑になります。詳細については、ランダム性に関する記事 を参照してください 。
KnownColor 列挙からランダムな色が必要なだけのように聞こえます。
色を配列に入れてから、ランダムインデックスを選択します。
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)];
}
}
上記のサンプルは、単にColor
タイプのすべての静的プロパティを検索することに注意してください。プロパティの実際の戻り値の型がColor
であることを確認することにより、これを改善することができます。
C#で色のリストを取得 からコピーしたコード
コード:
private List<string> GetColors()
{
//create a generic list of strings
List<string> colors = new List<string>();
//get the color names from the Known color enum
string[] colorNames = Enum.GetNames(typeof(KnownColor));
//iterate thru each string in the colorNames array
foreach (string colorName in colorNames)
{
//cast the colorName into a KnownColor
KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), colorName);
//check if the knownColor variable is a System color
if (knownColor > KnownColor.Transparent)
{
//add it to our list
colors.Add(colorName);
}
}
//return the color list
return colors;
}
または、これを試すことができます:.NET 4.5の場合
public Windows.UI.Color GetRandomColor()
{
Random randonGen = new Random();
Windows.UI.Color randomColor =
Windows.UI.Color.FromArgb(
(byte)randonGen.Next(255),
(byte)randonGen.Next(255),
(byte)randonGen.Next(255),
(byte)randonGen.Next(255));
return randomColor;
}
ルックアップテーブルを作成します。特にいくつかの色は個人的な解釈次第です。
Color構造体( http://msdn.Microsoft.com/en-us/library/system.drawing.color.aspx )の各色の値を確認し、RGB値にマップします。次に、元に戻すには、RGB値を参照して、名前の付いた色があるかどうかを確認します。
あなたがしたいように、列挙をランダム化する方法はありません、最も適切なソリューションは、すべての色の値でリストを設定し、それをランダム化する整数を取得し、それをリストのインデックスとして使用することで合格します。
ここでは、完成したプロファイルに基づいて色を生成しています。
public string generateColour(Decimal percentProfileComplete )
{
if(percent < 50)
{
return "#" + (0xff0000 | Convert.ToInt32(Convert.ToDouble(percentProfileComplete ) * 5.1) * 256).ToString("X6");
}
return "#" + (0xff00 | (255 - Convert.ToInt32((Convert.ToDouble(percentProfileComplete ) - 50) * 5.1)) * 256 * 256).ToString("X6");
}
元の質問の構文エラーを解決するには、
Color.FromRgb、および
(バイト)random2.Next(255)
整数をColorが必要とするバイト値に変換します。
Random random2 = new Random();
public int nn = 0x128;
public int ff = 0x512;
Color randomColor = Color.FromRgb((Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff));
Pihの答えにコメントしたでしょう。しかし、カルマが十分ではありません。だれでも、私はこれを実装しようとしましたが、コードがすばやく連続して繰り返し呼び出されたため、複数の呼び出しから同じ色が生成されるという問題に遭遇しました(つまり、randomGenは同じであり、クロックに基づいているため、同じ結果が発生しました)。
代わりにこれを試してください:
public class cExample
{
...
Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
...
private Color get_random_color()
{
KnownColor randomColorName = names[randomGen.Next(names.Length)];
return Color.FromKnownColor(randomColorName);
}
...
}
private string getRandColor()
{
Random rnd = new Random();
string hexOutput = String.Format("{0:X}", rnd.Next(0, 0xFFFFFF));
while (hexOutput.Length < 6)
hexOutput = "0" + hexOutput;
return "#" + hexOutput;
}