我需要一些随机颜色来画一个馅饼。我的代码可以工作,但它可以一次又一次地使用相同的颜色
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
}
我如何重做它,以便它不会再次选择相同的颜色。
答案 0 :(得分:2)
通常最好先预先创建一些漂亮的调色板,然后从调色板中选择颜色。在伪代码中:
var Palette = new Array(Color(r1, g1, b1), Color(r2, g2, b2), …);
for (var i=0; i<numberOfPieSegments; i++)
drawPieSegment(Palette[i % Palette.length], …);
答案 1 :(得分:2)
您可以将生成的随机颜色放入容器中,然后检查容器中是否已插入某个delta 的相似颜色。
通过这种方式,您不会冒险选择不同的颜色但非常相似,例如:
RGB(0, 0, 0)
和RGB(10, 2, 3)
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
}
答案 2 :(得分:-1)
请参阅msdn for descripton of Random class,检查一下:但是,因为时钟具有有限的分辨率,使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,生成相同的随机数序列。
因此,您应该使用不同的种子来每次初始化Random实例。我推荐时间戳。