Проблема генерации случайных цветов - asp.net и c # - PullRequest
5 голосов
/ 03 декабря 2010

Мне нужно сгенерировать, чтобы генерировать случайные цвета в шестнадцатеричных значениях в моем приложении asp.net для рисования графика.

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

Приведенный выше код генерирует случайные цветовые коды. Но моя проблема в том, что некоторое время он генерирует цвета, почти похожие на предыдущие. Из-за того, что я использую его для целей графика, мне нужно генерировать совершенно разные цвета. Любые идеи ....

Ответы [ 5 ]

5 голосов
/ 03 декабря 2010

Попробуйте

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

- EDIT -

Обновление после комментария 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));
    }
}

Usage:

colorRandom.GetNext();
4 голосов
/ 03 декабря 2010

Я, возможно, неправильно понял вопрос ...
Если проблема состоит в том, чтобы избежать подобных последовательностей цветов, производимых с течением времени, см. Ответ 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);
  }
3 голосов
/ 03 декабря 2010

Я не вижу достаточно вашего кода, но это должно помочь, если я правильно угадаю о том, как код структурирован ... это должно прояснить, почему числа одинаковы или близки к нему, потому что я имелпохожая проблема, и вот как я решил ее, и почему я думаю, что это было решением.

У меня был некоторый код, который генерировал случайные числа, которые выглядели так (значительно упрощенно)

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

Когда этовыполнив его, он фактически создал те же самые числа для части цикла (скажем, 8 итераций), затем переключился на новый номер, повторенный для 9 итераций и т. д. Я решил его, изменив его так, чтобы он выглядел следующим образом:

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

1 голос
/ 03 февраля 2011

перейдите по этой ссылке, чтобы узнать больше

Проверьте генератор случайных цветов DLL

1 голос
/ 03 декабря 2010
Random r=new Random();
var newCol=(r.Next(0,256)<<16)+(r.Next(0,256)<<8)+(r.Next(0,256));

Если вы хотите более яркие цвета, рассмотрите возможность увеличения минимального параметра Next

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...