如何最有效地使用C#随机方法?

时间:2013-06-27 04:28:59

标签: c# loops random sharepoint-2010 radiobuttonlist

我已经能够使用随机方法完成我的大多数任务,试图随机填充标签和RadioButtonList项目以创建一个5问题测验。 在给出大型池的情况下,代码可以很好地混合问题。

然而,随机填充RadioButtonList项目的内部代码表现得很有趣。

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

  2. 但是,当我打开浏览器并从Sharepoint网站运行它时,我将其部署到, 答案遵循每个下一个问题/所有问题的相同顺序。 注意:但它会在页面刷新时抛出唯一的订单;换句话说,当我再次开始测验时。

  3. 我似乎无法弄清楚我生命中的障碍。 可以使用几组眼睛。

    以下是目前的代码:请提供建议

      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;
            }
        }
    

2 个答案:

答案 0 :(得分:1)

问题是(在循环内):

Random rand2 = new Random();

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

  • 完全丢失内部Random实例(rand2) - 只使用单个外部实例(rand);使用更多Random个实例不会增加随机性
  • 使用外部实例为内部实例设定种子

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

答案 1 :(得分:1)

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

要解决此问题,我只需使用单个rand变量生成所有随机数,或在最外层循环外初始化rand2