1

簡単な WindowsFormsApplication を作成しましたが、いくつか問題があります。フォームには、10 個の TextBox と 1 つのボタンがあります。プログラムの目的は、ボタンをクリックしたときに、すべてのボックスに異なる番号を生成することです。コードの一部を次に示します。

private void button1_Click(object sender, EventArgs e)
    {
        int p = 0;
        int[] array = GeneratingArray();

        foreach (Control c in tableLayoutPanel1.Controls)
        {
            if (c.GetType().ToString() == "System.Windows.Forms.TextBox")
            {
                c.Text = array[p].ToString();
                p++;
            }
        }
    }

    public int GeneratingInt()
    {
        int random;
        Contract.Ensures(Contract.Result<int>() > -11, "Array out of Bounds(-10 ; 10)");
        Contract.Ensures(Contract.Result<int>() < 11, "Array out of Bounds(-10 ; 10)");
        Random gnr = new Random();
        random = gnr.Next(20);
        return random;
    }

    public int[] GeneratingArray()
    {
        int[] array = new int[10];
        int random;
        for (int i = 0; i < 10; i++)
        {
            random = GeneratingInt();
            array[i] = random;
        }

        return array;
    }

問題は、デバッガーを使用するとすべて正常に動作しますが、すべてのボックスでアプリケーションを起動すると同じ番号が生成されることです。この種の問題の原因がわかりませんので、お尋ねします。ありがとう。

4

1 に答える 1

6

問題は、アプリケーションの実行速度が速すぎることです。

Randomへのすべての呼び出しの新しいインスタンスを作成することによりGeneratingInt、ランダムに現在の時刻をシードしています。タイトなループで実行すると、ランダム ジェネレーターは毎回同じ数を提供します。

クラス レベルの変数に移動Randomし、一度構築して、同じインスタンスを再利用します。これにより、希望どおりに動作します。

于 2012-12-15T20:14:11.420 に答える