我想在wpf中生成一些随机颜色,并将它们存储在一个数组中。
Random r;
Color[] colarr = new Color[6];
for (int i = 0; i < colarr.Length; i++)
{
Color c=new Color();
r=new Random();
r.Next();
c.R = (byte)r.Next(1, 255);
c.G = (byte)r.Next(1, 255);
c.B = (byte)r.Next(1, 255);
c.A = (byte)r.Next(1, 255);
c.B = (byte)r.Next(1, 255);
colarr[i] = c;
}
但是数组中的所有元素都表示一种颜色。当我调试代码时,我发现每个元素的颜色都是随机的,但当代码执行时(不是在调试模式下),就会生成相同的颜色。这清楚地表明代码是正确的,在执行时存在一些问题。
编辑:
如何增加生成的颜色的随机性?
发布于 2013-05-18 11:35:33
问题是你每次运行都会创建一个随机的新实例。您只需设置一次。
Random的默认种子是系统时间,如果您重复一个非常快的循环,它将是相同的;时间不会有太大变化。如果你只在一开始设置它,随机数将会像预期的那样工作。
我还建议您使用r.Next(0, 256)
,因为它将为您提供从0到255的任何值。
而且,在定义Color c
之后调用r.Next()
是完全不必要的,因为您没有使用它的值。
Random r = new Random();
Color[] colarr = new Color[6];
for (int i = 0; i < colarr.Length; i++)
{
Color c=new Color();
c.R = (byte)r.Next(0, 256);
c.G = (byte)r.Next(0, 256);
c.B = (byte)r.Next(0, 256);
c.A = (byte)r.Next(0, 256);
//c.B = (byte)r.Next(1, 255); This line isn't needed btw
colarr[i] = c;
}
发布于 2013-05-18 11:35:56
试着这样做;
Random r = new Random();
Color[] colarr = new Color[6];
for (int i = 0; i < colarr.Length; i++)
{
Color c=new Color();
c.R = (byte)r.Next(0, 256);
c.G = (byte)r.Next(0, 256);
c.B = (byte)r.Next(0, 256);
c.A = (byte)r.Next(0, 256);
c.B = (byte)r.Next(0, 256);
colarr[i] = c;
}
来自;
每次执行
new Random()
时,都会使用时钟对其进行初始化。这意味着在一个紧凑的循环中,你会多次得到相同的值。您应该保留单个Random
实例,并在同一实例上继续使用Next
。
阅读:Random number generator only generating one random number
发布于 2013-05-18 12:00:04
如果你想要一种不同的方法来选择随机颜色,你可以使用反射。您必须根据调用频率来比较性能,但它可能返回不太相似的结果。注rnd
值不存储在函数中,否则您将遇到与最初问题中相同的问题,即在快速连续调用方法时(例如从for
循环)返回相同的值。
Random rnd = new Random();
private Color GetRandomColour()
{
var colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
var colors = colorProperties.Select(prop => (Color)prop.GetValue(null, null));
int index = rnd.Next(colors.Count());
return colors.ElementAt(index);
}
您可以像这样使用它
for (int i = 0; i < colarr.Length; i++)
{
colarr[i] = GetRandomColour();
}
https://stackoverflow.com/questions/16623802
复制相似问题