2

我想在 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;
}

但是数组的所有元素都代表一种颜色。当我调试代码时,我发现每个元素的颜色都是随机的,但是当代码执行时(不是在调试模式下)会生成相同的颜色。这清楚地表明代码是正确的,执行时存在一些问题。

编辑 :

如何增加生成颜色的随机性?

4

3 回答 3

4

问题是您每次运行都会创建一个新的 random 实例。你应该设置一次。

Random 的默认种子是系统时间,如果您重复一个非常快速的循环,它将是相同的;时间不会有太大变化。如果您只在开始时设置它,则 Random 将按预期工作。

我还建议您使用r.Next(0, 256),因为这将为您提供从 0 到 255 的任何值。

r.Next()此外,在定义之后调用 toColor c是完全没有必要的,因为您不使用它的值。

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-18T11:35:33.423 回答
3

试试这样;

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在同一个实例上使用。

阅读:随机数生成器只生成一个随机数

于 2013-05-18T11:35:55.567 回答
2

如果你想要一种不同的方法来选择随机颜色,你可以使用反射。您必须根据调用频率来比较性能,但它可能返回不太相似的结果。请注意,该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();
}
于 2013-05-18T12:00:04.000 回答