首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成随机颜色的问题

生成随机颜色的问题
EN

Stack Overflow用户
提问于 2013-05-18 19:32:50
回答 3查看 1.1K关注 0票数 2

我想在wpf中生成一些随机颜色,并将它们存储在一个数组中。

代码语言:javascript
运行
复制
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;
}

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

编辑:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-18 19:35:33

问题是你每次运行都会创建一个随机的新实例。您只需设置一次。

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

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

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

代码语言:javascript
运行
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2013-05-18 19:35:56

试着这样做;

代码语言:javascript
运行
复制
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

票数 3
EN

Stack Overflow用户

发布于 2013-05-18 20:00:04

如果你想要一种不同的方法来选择随机颜色,你可以使用反射。您必须根据调用频率来比较性能,但它可能返回不太相似的结果。注rnd值不存储在函数中,否则您将遇到与最初问题中相同的问题,即在快速连续调用方法时(例如从for循环)返回相同的值。

代码语言:javascript
运行
复制
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);
}

您可以像这样使用它

代码语言:javascript
运行
复制
for (int i = 0; i < colarr.Length; i++)
{          
   colarr[i] = GetRandomColour();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16623802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档