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オブジェクトによって返される値(疑似乱数関数の値)を決定する値です。これは、同じシードで2つのオブジェクトを作成すると、後続のメソッドRandomで同じ値を返すことを意味します。Next()

あなたの場合、メソッドを数回呼び出しているので、シードは同じである可能性があり、それがすべてのラベルに対して同じ値を返す理由です。

推奨される解決策

これを修正するにはRandom rand = new Random();、メソッドの外に移動して、クラスインスタンスに対して1回だけ作成します。

于 2012-05-19T15:28:02.407 に答える
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;
    }
于 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 に答える