我基本上是想写一个测验作为我的计算机编程类作业的一部分,但我遇到了麻烦。
我希望从随机池中选择问题以防止作弊,我可以让它在 1,8 之间随机选择,但这可能会导致重复提问,这是我不会做的事情我不想。
Random random = new Random(); // We use this random object to choose random icons for the squares.
List<int> Assignments = new List<int>()
{
1,2,3,4,5,6,7,8
};
Random RandomlyChooseNumbers = new Random();
int AssignmentForQ1;
int AssignmentForQ2;
int AssignmentForQ3;
int AssignmentForQ4;
string CorrectAnswerA1;
string CorrectAnswerA2;
string CorrectAnswerA3;
string CorrectAnswerA4;
public double timePassed;
public int calculatedScore;
public int timeLeft;
public frmQuizOneHardMode()
{
InitializeComponent();
AssignQuestionToTextQ1();
}
private void AssignQuestionToTextQ1()
{
int randomNumber = RandomlyChooseNumbers.Next(Assignments.Count);
AssignmentForQ1 = Assignments[randomNumber];
Assignments.RemoveAt(randomNumber);
AssignmentForQ2 = Assignments[randomNumber];
Assignments.RemoveAt(randomNumber);
AssignmentForQ3 = Assignments[randomNumber];
Assignments.RemoveAt(randomNumber);
AssignmentForQ4 = Assignments[randomNumber];
Assignments.RemoveAt(randomNumber);
}
但由于某种原因,数字总是相同的,这意味着 AssignmentForQ1、Q2、Q3 和 Q4 都显示完全相同的问题,我完全不知道这里出了什么问题,有人可以帮忙吗?
编辑:我个人要感谢 Jamiec,伙计,你是一个完整的救星,没有你我不可能做到这一点,谢谢!
最佳答案
你已经完成了一半。一般的想法是选择一个随机数,然后删除该元素,这样它就不能被重新选择。但是,您需要在每次尝试后从缩减集中选择一个新随机数,以便所有元素都是随机的。
int randomNumber1 = RandomlyChooseNumbers.Next(Assignments.Count);
AssignmentForQ1 = Assignments[randomNumber1];
Assignments.RemoveAt(randomNumber1);
// set is reduced
int randomNumber2 = RandomlyChooseNumbers.Next(Assignments.Count);
AssignmentForQ2 = Assignments[randomNumber2];
Assignments.RemoveAt(randomNumber2);
这可以通过使用数组进行赋值和循环来简化
int[] Questions = new int[4];
for(var i=0;i<Questions.Length;i++)
{
int randomNumber = RandomlyChooseNumbers.Next(Assignments.Count);
Questions[i] = Assignments[randomNumber];
Assignments.removeAt(randomNumber);
}
关于c# - 如何从随机池中选择一个号码,然后让号码不能重新选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947610/