即使使用"new"关键字,也会重复列表项

Jac*_*ack 0 c# asp.net

很抱歉提出这样一个模糊的问题,我是新手使用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();
}
Run Code Online (Sandbox Code Playgroud)

问题类可以在这里找到: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>
Run Code Online (Sandbox Code Playgroud)

输出:

9减法6 3 9减法6 3 9减法6 3 9减法6 3 9减法6 3 9减法6 3 9减法6 3 9减法6 3 9减法6 3 9减法6 3

Rog*_*mbe 5

你做错了什么:

  1. Random为每个创建一个新对象Question.
  2. 由于您没有为Random构造函数提供参数,因此使用默认的基于时间的种子.这使用Environment.TickCount(虽然我不认为这是专门记录的),因此它具有毫秒级的粒度.
  3. 由于您以相同的毫秒构造所有问题,因此它们将使用相同的种子.
  4. 这意味着他们将获得相同的随机数序列.
  5. 这意味着您可以获得10个不同的问题,但都具有相同的值.

解决这个问题的最简单方法是制作你的Random对象static,这意味着它由所有Question对象共享- 或者属于Question类,而不是问题实例.这意味着它只会被构造一次,你将得到一个合理的随机数序列.