很抱歉提出这样一个模糊的问题,我是新手使用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
答案 0 :(得分:5)
你做错了什么:
Random
创建一个新的Question
对象。Random
构造函数提供参数,默认情况下,
基于时间的种子被使用。这使用Environment.TickCount
(虽然我不认为这是专门记录的),因此它具有毫秒级的粒度。解决此问题的最简单方法是制作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类的种子总是一样的吗?