gpt4 book ai didi

c# - 生成随机颜色的问题 - asp.net 和 c#

转载 作者:太空狗 更新时间:2023-10-29 22:14:57 25 4
gpt4 key购买 nike

我需要在我的 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);
}

关于c# - 生成随机颜色的问题 - asp.net 和 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4342765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com