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

标签 c# asp.net colors

我需要在我的 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/

相关文章:

javascript - 如何在页面加载后禁用下拉列表框项目的选择?

ASP.NET Cookie 过期值在 Response.Redirect 上重置?

c# - 标准化音频,如何将 float 组转换为字节数组?

c# - 为什么 Entity Framework 6.1 不一致地检索相关实体?

c# - 基于具有删除按钮的数据类型的 Listview 项目

c# - 使用 LINQ 交错多个(超过 2 个)不规则列表

c# - 如何通过域对象和服务中的验证与 UI 层中的验证保持 DRY

类似 c 语言的 Emacs 模式

colors - Cocos2d如何使用CCC4?

python - Matplotlib:将背景颜色图与 pandas 列值匹配