使用Random对象生成颜色

时间:2012-05-19 15:25:53

标签: c#

我有一个带有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个标签都分配了相同的背景颜色,而不是每个标签都是单独随机化的。

我做错了什么?

3 个答案:

答案 0 :(得分:6)

问题的可能原因

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

<强>解释

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

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

建议的解决方案

为了解决这个问题,请将Random rand = new Random();移到方法之外,只为类实例创建一次。

答案 1 :(得分:0)

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

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;
    }

答案 2 :(得分: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

上的精彩页面