我已经能够使用随机方法完成我的大多数任务,试图随机填充标签和RadioButtonList项目以创建一个5问题测验。 在给出大型池的情况下,代码可以很好地混合问题。
然而,随机填充RadioButtonList项目的内部代码表现得很有趣。
当我在while循环中输入断点并逐步运行时,每个下一个问题都会以不同的顺序填充答案。
但是,当我打开浏览器并从Sharepoint网站运行它时,我将其部署到, 答案遵循每个下一个问题/所有问题的相同顺序。 注意:但它会在页面刷新时抛出唯一的订单;换句话说,当我再次开始测验时。
我似乎无法弄清楚我生命中的障碍。 可以使用几组眼睛。
以下是目前的代码:请提供建议
public void LoadQuestions()
{
try
{
SPWeb thisWeb = SPContext.Current.Web;
SPList oSPList = thisWeb.Lists["QuestionsAndAnswers"];
SPListItemCollection oSPListItemCollection = oSPList.Items;
Random rand = new Random();
List<int> tempStore = new List<int>();
List<int> tempStore2 = new List<int>();
int tempValue = 0;
//int tempValue2 = 0;
int icount = 1;
int iMax = oSPListItemCollection.Count;
//int icount2 = 0;
//int iMax2 = oSPListItemCollection.Count;
SPListItem thisItem;
Label thisQuestion;
Label thisCorrectAnswer;
RadioButtonList thisAnswers;
while (icount < 6)
{
tempValue = rand.Next(1, iMax);
if (tempStore.Exists(value => value == tempValue))
continue;
else
{
tempStore.Add(tempValue);
thisQuestion = (Label)UpdatePanelMaster.FindControl("Question" + icount.ToString());
thisItem = oSPListItemCollection[tempValue];
thisQuestion.Text = icount + ". " + thisItem["Question"].ToString();
thisCorrectAnswer = (Label)UpdatePanelMaster.FindControl("CorrectAnswer" + icount.ToString());
thisCorrectAnswer.Text = thisItem["CorrectAnswer"].ToString();
thisAnswers = (RadioButtonList)UpdatePanelMaster.FindControl("RadioButtonList" + icount.ToString());
//Entering code to handle random answer arrangements
//This code works ok when run in a step by step debug fashion but no when deployed and run from the website directly.
Missing/Changes required?
int tempValue2;
int Icounter = 0;
string[] AnswerArr = new string[] { thisItem["CorrectAnswer"].ToString(), thisItem["IncorrectAnswer1"].ToString(), thisItem["IncorrectAnswer2"].ToString(), thisItem["IncorrectAnswer3"].ToString() };
Random rand2 = new Random();
while (Icounter < 4)
{
tempValue2 = rand2.Next(0, 13);//max number of items in the array
decimal toCeilingVar = tempValue2 / 4;
int fraction = Convert.ToInt32(System.Math.Ceiling(toCeilingVar));
string tempArrValue = AnswerArr[fraction];
if (thisAnswers.Items.FindByValue(tempArrValue) == null)
{
//add new value because the current value is not in the list
thisAnswers.Items.Add(tempArrValue);
Icounter++;
tempArrValue = string.Empty;
}
tempValue2 = 0;
toCeilingVar = 0;
fraction = 0;
//End Random Answer handling
}
tempValue = 0;
icount++;
}
}
}
//End random question handling
catch (Exception ex)
{
throw ex;
}
}
答案 0 :(得分:1)
问题是(在循环内):
Random rand2 = new Random();
Random
类,如果没有提供明确的种子,则使用时间播种。如果您在紧密循环中创建多个实例,它们通常会足够接近(及时),因为它们具有相同的种子。这意味着它们都将生成相同的伪随机数序列。两个选项:
Random
实例(rand2
) - 只使用单个外部实例(rand
);使用更多Random
个实例不会增加随机性如果有充分的理由,我只会使用后者,例如并行性
答案 1 :(得分:1)
这里可能发生的事情是,在生产中运行时,在非常短的时间间隔内多次调用行Random rand2 = new Random()
,因此每个实例将具有相同的初始种子值。根据我的经验,Random的默认构造函数使用基于时间的种子,分辨率相当低。
要解决此问题,我只需使用单个rand
变量生成所有随机数,或在最外层循环外初始化rand2
。