C#随机颜色生成器无法正常工作

时间:2013-04-01 08:11:11

标签: c# colors grid geometry drawing

这部分代码行为不端。 我想绘制一个用户定义的圆圈网格,每个圆圈都有一个7种颜色的设置列表中的随机颜色。 随机数生成器应该这样做。 圆圈的网格被绘制得很好,它的颜色让我感到悲伤。 我似乎每格最多两种颜色,前十二种是一种颜色,其余颜色是第二种颜色。 奇怪的是,因为代码应循环通过颜色生成器,然后绘制一个圆圈并重复。 请帮我找到麻烦的线条,花太多时间自己尝试!

忽略对JEWEL_HEIGHT等的引用,它们只是与程序相关的变量名。

              int columns = int.Parse(textBoxColumns.Text);
            int rows = int.Parse(textBoxRows.Text);


            for (int y = 0; (y < rows * 20); y += JEWEL_HEIGHT)
            {
                for (int x = 0; (x < columns * 20); x += JEWEL_WIDTH)
                {


                    Color brushColor = (Color.Red);
                    Random randGen = new Random();
                    int randColor = randGen.Next(7);
                    if (randColor == 0)
                        brushColor = (Color.Red);
                    else if (randColor == 1)
                        brushColor = (Color.Orange);
                    else if (randColor == 2)
                        brushColor = (Color.Yellow);
                    else if (randColor == 3)
                        brushColor = (Color.Green);
                    else if (randColor == 4)
                        brushColor = (Color.Blue);
                    else if (randColor == 5)
                        brushColor = (Color.Indigo);
                    else if (randColor == 6)
                        brushColor = (Color.Violet);

                    Graphics paper = pictureBoxJewels.CreateGraphics();
                    SolidBrush brush = new SolidBrush(brushColor);

                    paper.FillEllipse(brush, x, y, JEWEL_WIDTH, JEWEL_HEIGHT);

3 个答案:

答案 0 :(得分:5)

不确定因为我无法测试它但随机randGen = new Random();不应该在for循环中。把它放在第一个for循环之前并保留randGen.Next(7);在循环内部。

答案 1 :(得分:0)

你每次都在初始化randgen。这里随机()不是真正的ramdom它遵循一些逻辑.. 并且它的时间依赖导致它的执行速度快,你可能得不到不同的数字,因为它可能在系统中获得相同的滴答计数

我编辑了我的回答

答案 2 :(得分:0)

这是Random默认构造函数(.NET 4.5,反编译):

public Random()
      : this(Environment.TickCount)
    {
    }

提示:很有可能你最终使用相同的种子,在循环之前移动Random

其他一些信息:

随机数生成从种子值开始。如果重复使用相同的种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值。

但是由于你的内循环运行得非常快,并且你在每次迭代时都创建了新实例,TickCount 可能不会改变