1

我有一个非常简单的表格,带有 16 个标签的网格,我希望从我选择的 12 种颜色中随机设置每个标签的背景颜色。

这是我的代码:

private void btnRandom_Click(object sender, EventArgs e)
    {
        txtA1.BackColor = RandomColor();
        txtA2.BackColor = RandomColor();
        txtA3.BackColor = RandomColor();
        txtA4.BackColor = RandomColor();
        txtB1.BackColor = RandomColor();
        txtB2.BackColor = RandomColor();
        txtB3.BackColor = RandomColor();
        txtB4.BackColor = RandomColor();
        txtC1.BackColor = RandomColor();
        txtC2.BackColor = RandomColor();
        txtC3.BackColor = RandomColor();
        txtC4.BackColor = RandomColor();
        txtD1.BackColor = RandomColor();
        txtD2.BackColor = RandomColor();
        txtD3.BackColor = RandomColor();
        txtD4.BackColor = RandomColor();
    }

    private Color RandomColor()
    {            
        Random rand = new Random();
        int r = rand.Next(1, 12);
        switch (r)
        {
            case 1:
                return Color.FromKnownColor(KnownColor.DodgerBlue);
            case 2:
                return Color.FromKnownColor(KnownColor.MediumAquamarine);
            case 3:
                return Color.FromKnownColor(KnownColor.Teal);
            case 4:
                return Color.FromKnownColor(KnownColor.OrangeRed);
            case 5:
                return Color.FromKnownColor(KnownColor.LightCoral);
            case 6:
                return Color.FromKnownColor(KnownColor.Red);
            case 7:
                return Color.FromKnownColor(KnownColor.MediumOrchid);
            case 8:
                return Color.FromKnownColor(KnownColor.MediumPurple);
            case 9:
                return Color.FromKnownColor(KnownColor.DarkOrchid);
            case 10:
                return Color.FromKnownColor(KnownColor.Lime);
            case 11:
                return Color.FromKnownColor(KnownColor.PaleGreen);
            case 12:
                return Color.FromKnownColor(KnownColor.SeaGreen);
            default:
                return Color.FromKnownColor(KnownColor.White);
        }
    }

但是发生的事情是所有 16 个标签都被分配了相同的背景色,而不是每个标签都被单独随机分配。

我究竟做错了什么?

4

3 回答 3

6

问题的可能原因

Random这是因为您每次调用该方法时都在创建对象RandomColor(),并且几乎同时调用它几次。

解释

当您编写new Random();伪随机函数时,会根据当前时间使用种子启动。种子是确定Random对象返回的值(伪随机函数的值)的值。这意味着当您Random使用相同的种子创建两个对象时,它们在后续Next()方法中返回相同的值。

在您的情况下,您多次调用该方法,因此种子可能是相同的,这就是它为所有标签返回相同值的原因。

建议的解决方案

为了修复它,移到Random rand = new Random();方法之外,只为一个类实例创建一次。

于 2012-05-19T15:28:02.407 回答
0

“如果你在方法级别使用新的 Random() 作为本地时间相关的种子会重复自己。” 链接 在随机类中使用静态变量:

private static Random rand = new Random();

private void btnRandom_Click(object sender, EventArgs e)
    {
        //code here
    }

    private Color RandomColor()
    {
        int r = rand.Next(1, 12);
        //switch here
        return Color.White;
    }
于 2012-05-19T15:29:19.883 回答
0

尝试类似的东西

static Random _r = new Random();
    static void F()
    {
    int n = _r.Next(5);
    // Can return 0, 1, 2, 3, or 4
    Console.WriteLine(n);
    }

随机http://www.dotnetperls.com/random上的精彩页面

于 2012-05-19T15:30:41.193 回答