C# 在绘制图表时,如何选择好的随机颜色?

C# 在绘制图表时,如何选择好的随机颜色?,c#,asp.net,random,colors,C#,Asp.net,Random,Colors,我需要一些随机的颜色来画一个派。我的代码可以工作,但它可以一次又一次地使用相同的颜色 Random r = new Random(); for (int i = 0; i < 20; i++) { int min = 0; int max = 255; int rand1 = r.Next(min, max); int rand2 = r.Next(min, max); int ran

我需要一些随机的颜色来画一个派。我的代码可以工作,但它可以一次又一次地使用相同的颜色

    Random r = new Random();

    for (int i = 0; i < 20; i++)
    {
        int min = 0;
        int max = 255;
        int rand1 = r.Next(min, max);
        int rand2 = r.Next(min, max);
        int rand3 = r.Next(min, max);
        Color myColor = Color.FromArgb(rand1, rand2, rand3);  
        //drawing the pie here
   }
Random r=new Random();
对于(int i=0;i<20;i++)
{
int min=0;
int max=255;
int rand1=r.Next(最小值,最大值);
int rand2=r.Next(最小值,最大值);
int rand3=r.Next(最小值,最大值);
Color myColor=Color.FromArgb(rand1,rand2,rand3);
//在这里画馅饼
}

我如何修改它,使它不再拾取相同的颜色。

通常最好事先创建一些漂亮的调色板,然后从调色板中拾取颜色。在伪代码中:

var Palette = new Array(Color(r1, g1, b1), Color(r2, g2, b2), …);
for (var i=0; i<numberOfPieSegments; i++)
    drawPieSegment(Palette[i % Palette.length], …);
var调色板=新数组(颜色(r1、g1、b1)、颜色(r2、g2、b2),…);
对于(var i=0;i请参见msdn,请勾选此项:但是,由于时钟的分辨率有限,因此使用无参数构造函数创建不同的连续随机对象会创建生成相同随机数序列的随机数生成器。

因此,每次都应该使用不同的种子来初始化随机实例。我建议使用时间戳。

您可以将生成的随机颜色放入容器中,然后检查容器中是否已经插入了某个增量的类似颜色

这样,您就不会冒险选择不同但非常相似的颜色,例如:
RGB(0,0,0)
RGB(10,2,3)

const int DELTA_百分比=10;
List alreadyChoosenColors=new List();
//初始化随机生成器
随机r=新随机();
对于(int i=0;i<20;i++)
{
bool chooseAnotherColor=true;
while(选择其他颜色)
{
//通过生成三个随机通道创建随机颜色
//
int redColor=r.Next(0255);
int greenColor=r.Next(0255);
int blueColor=r.Next(0255);
Color tmpColor=Color.FromArgb(红色、绿色、蓝色);
//检查是否已经创建了类似的颜色
//
选择其他颜色=假;
foreach(颜色c以AlreadyChoosenColor表示)
{
int delta=c.R*delta_百分比/100;

如果(c.R-delta是Java吗?请正确标记。可能随机生成器需要一个种子编号,例如asp.net中的timestampits c#,我尝试设置种子编号对正确的
随机
:这不是这里发生的事情。OP正在构造
随机
的一个实例并使用它。OP可能正在选择相似的颜色(即使数字不同,看起来也一样)。我无法让List alreadyChoosenColors=new ArrayList();正常工作这是一个很好的解决方案,但有时如果颜色太大,需要手动创建,则需要随机生成器为我们节省很多时间
const int DELTA_PERCENT = 10;
List<Color> alreadyChoosenColors = new List<Color>();

// initialize the random generator
Random r = new Random();

for (int i = 0; i < 20; i++)
{
    bool chooseAnotherColor = true;      
    while ( chooseAnotherColor )
    {
       // create a random color by generating three random channels
       //
       int redColor = r.Next(0, 255);
       int greenColor = r.Next(0, 255);
       int blueColor = r.Next(0, 255);
       Color tmpColor = Color.FromArgb(redColor, greenColor, blueColor);  

       // check if a similar color has already been created
       //
       chooseAnotherColor = false;
       foreach (Color c in alreadyChoosenColors)
       {
          int delta = c.R * DELTA_PERCENT / 100;
          if ( c.R-delta <= tmpColor.R && tmpColor.R <= c.R+delta )
          {
             chooseAnotherColor = true;
             break;
          }

          delta = c.G * DELTA_PERCENT / 100;
          if ( c.G-delta <= tmpColor.G && tmpColor.G <= c.G+delta )
          {
             chooseAnotherColor = true;
             break;
          }

          delta = c.B * DELTA_PERCENT / 100;
          if ( c.B-delta <= tmpColor.B && tmpColor.B <= c.B+delta )
          {
             chooseAnotherColor = true;
             break;
          }
        }
    }

    alreadyChoosenColors.Add(tmpColor);
    // you can safely use the tmpColor here

   }