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

时间:2012-06-21 12:02:38

标签: 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();
}

问题类可在此处获得: 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 减去 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

3 个答案:

答案 0 :(得分:5)

你做错了什么:

  1. 您为每个Random创建一个新的Question对象。
  2. 由于您没有为Random构造函数提供参数,默认情况下, 基于时间的种子被使用。这使用Environment.TickCount(虽然我不认为这是专门记录的),因此它具有毫秒级的粒度。
  3. 由于您在同一毫秒内构建了所有问题, 他们会使用相同的种子。
  4. 这意味着他们将获得相同的随机数序列。
  5. 这意味着您可以获得10个不同的问题,但所有问题都有 相同的价值观。
  6. 解决此问题的最简单方法是制作Random对象static,这意味着它由所有Question个对象共享 - 或属于Question类,而不是问题实例。这意味着它只会被构造一次,你将得到一个合理的随机数序列。

答案 1 :(得分:3)

每个问题都有自己的Random实例,它们很可能都生成相同的值。

当你使用默认的Random构造函数时,它是initialized with a seed derived from the system clock,如果在创建对象之间有这么短的时间,很可能系统时钟值不会改变在实例化之间。

确切地说,Random初始化为Environment.TickCount(至少在.NET 4.0中),每毫秒只更改一次。这是足够的时间来创建无数的Question个对象。

解决方案:制作Random字段static

答案 2 :(得分:1)

如果新问题()应该返回一个新的随机问题,并且你想要10个随机问题,我认为“随机”函数总是返回相同的问题,所以验证问题对象。 Random类的种子总是一样的吗?