如何从随机池中选择一个数字,然后使这个数字无法重新选择

Jam*_*ett 3 c# random

我基本上试着写一个测验作为我的计算机编程课程的一部分,我遇到了一个麻烦的地方.

我希望从随机池中选择问题以阻止作弊,我可以使它在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);
    }
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,数字总是相同的,这意味着AssignmentForQ1,Q2,Q3和Q4都显示完全相同的问题,我真的不知道这里出了什么问题,有人可以帮忙吗?

编辑:我个人要感谢Jamiec,伙伴,你是一个完整的救生员,没有你我不可能做到这一点,谢谢!

Jam*_*iec 6

你在那里的一半.一般的想法是选择一个随机数,然后删除该元素,以便不能重新选择.但是,您需要在每次尝试后从简化集中选择一个新的随机数,以便所有元素都是随机的.

 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);
Run Code Online (Sandbox Code Playgroud)

这可以通过为您的赋值和循环使用数组来简化

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 打败我.OP可能希望将其概括为循环.当我发现自己一遍又一遍地编写相同的代码行时,我总是开始担心...... (3认同)