我正在生成一些需要用十六进制字符串表示颜色的图表。
例如:
<dataseries name="ford" color="FF00FF" />
我正在动态创建这些数据系列,因此我希望随机生成每个数据系列的十六进制代码。
那么,最好的方法是什么?
最简单的方法是使用 String.Format
函数,并使用十六进制格式作为参数。
var random = new Random();
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
var color = $"#{random.Next(0x1000000):X6}";
其中,变量 color 将得到一个随机的六位十六进制颜色值。 - Iain M NormanSamuel的回答是实现这个功能的最佳方法,只需确保如果你在循环内生成颜色,不要每次都实例化一个新的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)));
}
在我看来,纯随机的颜色可能不是首选,因为你需要人眼可以区分的颜色。
那么预设一些颜色并随机选择它们呢?
也许你可以在一些开源绘图库中找到更好的答案。
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)]
(我确实喜欢列表推导式...)
Random rand = new Random(); // specify a seed
int r = rand.Next(0x1000000);
Console.WriteLine("#{0:X6}", r);
Hue = (PreviousHue + 50) % 360;