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 减 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

4

3 回答 3

5

你做错了什么:

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

解决这个问题的最简单方法是创建你的Random对象static,这意味着它被所有Question对象共享——或者属于Question类,而不是质疑实例。这意味着它只会被构造一次,并且你会得到一个合理的随机数序列。

于 2012-06-21T12:09:59.407 回答
3

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

当您使用默认Random构造函数时,它会使用派生自系统时钟的种子进行初始化,如果创建对象之间的时间如此短,则很可能系统时钟值在实例化之间不会发生变化。

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

解决方案:制作Random字段static.

于 2012-06-21T12:10:08.967 回答
1

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

于 2012-06-21T12:19:01.010 回答