0

このような漠然とした質問をしてすみません、私はC#/ASP.NETを使用するのは初めてです。ランダムに生成された質問を作成し、forループを使用してリスト内に質問オブジェクトを保存すると、質問を出力したときに同じ/重複した質問が表示されます。デバッガーで質問のリストを調べたところ、同じオブジェクトが10個表示されています。

サーバー側C#質問のリストを作成するために使用されます。

private void Populate()
{
    __NumberOfQuestions = 10;
    __Questions = new List<Question>(__NumberOfQuestions);

    for (int i = 0; i < __NumberOfQuestions; i++)
    {
        __Questions.Add(new Question());
    }

    QuestionList.DataSource = __Questions;
    QuestionList.DataBind();
}

質問クラスはここで利用できます: http://pastebin.com/mEArQFHh

ページに質問を追加するために使用されるASPコード:

            <asp:Repeater ID="QuestionList" runat="server">
                <ItemTemplate>
                    <tr>
                        <td><%#DataBinder.Eval(Container.DataItem,"__LeftOperand")%></td>
                        <td><%#DataBinder.Eval(Container.DataItem,"__Operator")%></td>
                        <td><%#DataBinder.Eval(Container.DataItem,"__RightOperand")%></td>
                        <td><%#DataBinder.Eval(Container.DataItem,"__Answer")%></td>
                    </tr>
                </ItemTemplate>
            </asp:Repeater>

出力:

9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3 9 SUBTRACT 6 3

4

3 に答える 3

5

あなたが間違っていること:

  1. Randomごとに新しいオブジェクトを作成しますQuestion
  2. コンストラクターに引数を指定しないためRandom、デフォルトの時間ベースのシードが使用されます。これはEnvironment.TickCount(これが具体的に文書化されているとは思いませんが)使用するため、ミリ秒の粒度があります。
  3. すべての質問を同じミリ秒で作成するため、同じシードが使用されます。
  4. これは、それらが同じ乱数のシーケンスを取得することを意味します。
  5. これは、10の異なる質問がありますが、すべて同じ値であることを意味します。

これを修正する最も簡単な方法は、Randomオブジェクトを作成することです。つまり、インスタンスに質問するのではなく、staticすべてのオブジェクトで共有されるQuestionか、クラスに属します。Questionこれは、1回だけ作成され、意味のある一連の乱数が得られることを意味します。

于 2012-06-21T12:09:59.407 に答える
3

すべての質問には独自のRandomインスタンスがあり、おそらくすべて同じ値を生成します。

デフォルトのRandomコンストラクターを使用すると、システムクロックから派生したシードで初期化されます。オブジェクトの作成間隔が非常に短い場合は、インスタンス化間でシステムクロック値が変更されない可能性があります。

正確には、 (少なくとも.NET 4.0では)でRandom初期化されます。これはミリ秒ごとに1回だけ変更されます。Environment.TickCountこれは、無数のQuestionオブジェクトを作成するのに十分な時間です。

解決策:Randomフィールドを作成しますstatic

于 2012-06-21T12:10:08.967 に答える
1

新しいQuestion()が新しいランダムな質問を返すことになっていて、10個のランダムな質問が必要な場合、「ランダム」関数は常に同じ質問を返すと思うので、Questionオブジェクトを確認します。ランダムクラスのシードは常に同じですか?

于 2012-06-21T12:19:01.010 に答える