c# - 如何从随机池中选择一个号码,然后让号码不能重新选择

标签 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);
    }

但由于某种原因,数字总是相同的,这意味着 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/

相关文章:

c# - 在.Net Core库中使用IHostingEnvironment

c# - 带有代码修复的 VS2015 诊断 - NuGet 或 VSIX 或两者?

c# - .net core 重定向到路由结果将 %2f 添加到 url

python - 为什么 numpy.random.choice 这么慢?

algorithm - 从抛硬币创建随机数生成器

python随机洗牌while循环

c# - MethodBase.IsConstructor 无法按照静态构造函数指定的方式工作

C# 确保随机数的存在

c - C 中随机不使用 rand() 函数

c# - 在 Web API 中管理版本