1

わかった。数日前に、配列を使用せずに 100、1000、10.000 などの乱数を生成する方法を質問しましたが、答えがそれほど明白ではなかったため、私の質問は削除されました。私は簡単な解決策でそれを手に入れましたが、今は別の問題があります。ここで試しているのは、動的に作成されたすべてのラベルに異なる乱数を設定することです。10行ごとに常に同じ番号が得られる理由はわかりません。私が仕事をしようとしている背後にあるコードは次のとおりです。

protected void btnExample1Random_Click(object sender, EventArgs e)
{
    //Making the controls visible
    this.Master.FindControl("Div1").Visible = true;        

    //Generating the random numbers
    for (int i = 0; i < 10; i++)
    {
        Label randomTask = new Label();
        Label emptyTask = new Label();
        TextBox userInputTextBox = new TextBox();
        Random rnd = new Random();

        int caseInt = rnd.Next(1, 4), myNum = 0;
        switch (caseInt)
        {
            case 1:
                caseInt = 100;
                myNum = rnd.Next(1, 100);
                break;
            case 2:
                caseInt = 1000;
                myNum = rnd.Next(1, 1000);
                break;
            case 3:
                caseInt = 10000;
                myNum = rnd.Next(1, 10000);
                break;
        }

        //Forming the controls
        randomTask.ID = "lbl" + i.ToString();
        randomTask.Text = caseInt.ToString() + " - " + myNum.ToString() + " ";
        userInputTextBox.ID = "box" + i.ToString();
        emptyTask.ID = "check" + i.ToString();

        //Adding the controls into the placeholder
        phTutorijal1.Controls.Add(randomTask);
        phTutorijal1.Controls.Add(userInputTextBox);
        phTutorijal1.Controls.Add(emptyTask);
        phTutorijal1.Controls.Add(new LiteralControl("<br />"));
    }

    //Separating the next created controls into new line
    phTutorijal1.Controls.Add(new LiteralControl("<br />"));
}

このコードには見つけられないバグがあります。プレースホルダーに生成される 10 行ごとに同じ番号が付けられます。ここで何を見逃したのですか?

更新: Michael Liu が私のバグの場所を発見しました: Random rnd = new Random();for サイクルの外側に置く必要がありました

4

1 に答える 1

2

ループ内でランダムなインスタンスを作成しているため、同じ数を取得しています。したがって、時間から派生した同じシードで初期化されます。ループの外で宣言するだけです:

Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
    int caseInt = rnd.Next(1, 4), myNum = 0;

MSDN :

乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の数値が生成されます。...

于 2013-02-25T22:28:24.273 に答える