使用随机对象生成颜色

本文关键字:颜色 对象 随机 | 更新日期: 2023-09-27 18:34:44

我有一个非常简单的表单,其中包含 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 个标签都被分配了相同的背景颜色,而不是每个标签都单独随机化。

我做错了什么?

使用随机对象生成颜色

问题的可能原因

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

解释

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

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

建议的解决方案

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

尝试类似的东西

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 上的伟大页面

"如果您在方法级别使用新的 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;
    }