加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 03:41:09 所属栏目:asp.Net 来源:网络整理
导读:我需要生成在我的asp.net应用程序中生成Hex值的随机颜色来绘制图形. Random random = new Random(); color = String.Format("#{0:X6}",random.Next(0x1000000)); 上面的代码生成随机颜色代码.但是我的问题是它有时会产生与之前颜色几乎相似的颜色.因为我将它
我需要生成在我的asp.net应用程序中生成Hex值的随机颜色来绘制图形.

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,prevB);
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读