1

我已经能够使用随机方法来完成我的大部分任务,即尝试随机填充标签和 RadioButtonList 项以创建 5 个问题的测验。鉴于它所提取的大量问题,该代码生成了一个很好的混合问题。

但是,随机填充 RadioButtonList 项的内部代码表现得很有趣。

  1. 当我在我的 while 循环中设置断点并逐步运行它时,答案会在下一个问题上以不同的顺序填充。

  2. 但是,当我只是打开浏览器并从我部署到的 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;
        }
    }
4

2 回答 2

1

问题是(在循环内):

Random rand2 = new Random();

Random如果没有提供明确的种子,则使用时间对该类进行播种。如果您在紧密循环中创建多个实例,它们通常会(及时)足够接近,以至于它们具有相同的种子。这意味着它们都将生成相同的伪随机数序列。两种选择:

  • 完全失去内部Random实例 ( rand2) - 只需使用单个外部实例 ( rand);使用更多Random实例不会增加随机性
  • 使用外部实例播种内部实例

如果有充分的理由,我只会使用后者,例如并行性

于 2013-06-27T04:41:33.343 回答
1

可能这里发生的情况是,当在生产中运行时,该行在Random rand2 = new Random()很短的时间间隔内被多次调用,因此每个实例将具有相同的初始种子值。根据我的经验,Random 的默认构造函数使用分辨率相当低的基于时间的种子。

为了解决这个问题,我将只使用单个rand变量来生成所有随机数,或者rand2在最外层循环之外进行初始化。

于 2013-06-27T04:45:03.993 回答