我需要在我的 asp.net 应用程序中生成十六进制值的随机颜色来绘制图表。
Random random = new Random();
color = String.Format("#{0:X6}", random.Next(0x1000000));
上面的代码生成随机颜色代码。但我的问题是有时它会生成与以前的颜色几乎相似的颜色。因为我将它用于图形目的,所以我需要生成完全不同的颜色。有任何想法吗....
我可能误解了这个问题...
如果要避免类似的问题序列随着时间的推移产生的颜色,请参阅 KMan 的回应,我认为这是第一个建议通过从同一个生成器生成所有随机值(而不是每次生成一个新生成器),可以避免使用以下生成器生成生成器的风险与之前使用的生成器相同的种子。
如果担心的是避免连续绘制两种“相似”颜色,则应执行以下响应。避免连续使用两种相似的颜色意味着
- 使用一些数学逻辑(但存在使用的函数无法像体面的随机数生成器那样覆盖所有可能颜色的光谱的风险)
- 绘制真正的随机颜色,但当它们被认为相似时拒绝它们(并重新尝试)。
第二种方法如以下代码片段所示。
样式是手写的,颜色接受标准有些随意,但这应该提供一个好主意。
此外,通过重复使用单个随机数生成器 (RNG),可以避免重复序列的风险(如果每次以某种方式创建 RNG,并且偶然使用相同的种子)...
const int minTotalDiff = 200; // parameter used in new color acceptance criteria
const int okSingleDiff = 100; // id.
int prevR, prevG, prevB; // R, G and B components of the previously issued color.
Random RandGen = null;
public string GetNewColor()
{
int newR, newG, newB;
if (RandGen == null)
{
RandGen = new Random();
prevR = prevG = prevB = 0;
}
bool found = false;
while (!found)
{
newR = RandGen.Next(255);
newG = RandGen.Next(255);
newB = RandGen.Next(255);
int diffR = Math.Abs(prevR - newR);
int diffG = Math.Abs(prevG - newG);
int diffB = Math.Abs(prevB - newB);
// we only take the new color if...
// Collectively the color components are changed by a certain
// minimum
// or if at least one individual colors is changed by "a lot".
if (diffR + diffG + diffB >= minTotalDiff
|| diffR >= okSingleDiff
|| diffR >= okSingleDiff
|| diffR >= okSingleDiff
)
found = true;
}
prevR = newR;
prevG = newG;
prevB = newB;
return String.Format("#{0:X2}{0:X2}{0:X2}", prevR, prevG, prevB);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)