我需要生成在我的asp.net应用程序中生成Hex值的随机颜色来绘制图形.
Random random = new Random();
color = String.Format("#{0:X6}", random.Next(0x1000000));
Run Code Online (Sandbox Code Playgroud)
上面的代码生成随机颜色代码.但是我的问题是它有时会产生与之前颜色几乎相似的颜色.因为我将它用于图形目的,我需要生成完全不同的颜色.有任何想法吗....
尝试
Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255));
Run Code Online (Sandbox Code Playgroud)
- 编辑 -
更新mjv的评论:
public class RandomColor
{
Random _random;
public RandomColor()
{
_random = new Random();
}
public Color GetNext()
{
return Color.FromArgb(_random.Next(0, 255), _random.Next(0, 255), _random.Next(0, 255));
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
colorRandom.GetNext();
Run Code Online (Sandbox Code Playgroud)
我可能误解了这个问题...
如果问题是为了避免随着时间的推移产生类似的颜色序列,请参阅 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);
}
Run Code Online (Sandbox Code Playgroud)