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

时间:2010-12-03 05:33:19

标签: c# asp.net colors

我需要生成在我的asp.net应用程序中以十六进制值生成随机颜色以绘制图形。

 Random random = new Random();
 color = String.Format("#{0:X6}", random.Next(0x1000000)); 

以上代码生成随机颜色代码。但是我的问题是它有时会产生与之前颜色几乎相似的颜色。因为我将它用于图形目的,我需要生成完全不同的颜色。任何想法......

5 个答案:

答案 0 :(得分:5)

尝试

Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255));

<强> - 编辑 -

更新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));
    }
}

<强>用法:

colorRandom.GetNext();

答案 1 :(得分:4)

我可能误解了这个问题...... 如果问题是为了避免随着时间的推移产生颜色的类似序列,请参阅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);
  }

答案 2 :(得分:3)

我看不到你的代码,但如果我猜对代码的结构是正确的,这应该会有所帮助...它应该澄清为什么数字是相同的,或接近它,因为我有一个类似的问题,这就是我如何解决它以及为什么我认为这是解决方案。

我有一些代码生成了看起来像这样的(大大简化)

for (some loop logic)
{
  Random r = new Random();
  int myRandomNumber = Random.Next()
}

当执行此操作时,它实际上为循环的一部分创建了完全相同的数字(比如8次迭代),然后切换到重复9次迭代的新数字等等。我通过将其更改为如下所示解决了这个问题:< / p>

Random r = new Random();
for (some loop logic)
{
  int myRandomNumber = Random.Next()
}

我确信其他人会更好地表达它,但是通过在循环外声明Random,Random类的实例能够跟踪生成的最后一个随机数,并确保下一个实际上是随机的。通过将其置于循环中(如第一个示例中),每次迭代都创建了一个新的Random对象,因此它只使用了任何逻辑(基于时间的假设)来生成随机数,而不知道不同的实例刚刚生成了相同的号。

男孩,我希望这是有道理的...现在已经很晚了,而且我没有清楚地解释,但我认为你的问题可能是你在循环逻辑中创建了一个新的随机类实例,你需要在循环之外声明它。

修改 - 添加

本文介绍了为什么会出现这种情况:

http://geekswithblogs.net/kakaiya/archive/2005/11/27/61273.aspx

答案 3 :(得分:1)

Random r=new Random();
var newCol=(r.Next(0,256)<<16)+(r.Next(0,256)<<8)+(r.Next(0,256));

如果您想要更亮的颜色,请考虑提高Next

的最小参数

答案 4 :(得分:1)

访问此链接以了解更多信息

Check out random color generator dll