【问题标题】:Get a unique number [closed]获得一个唯一的号码[关闭]
【发布时间】:2014-06-11 18:14:38
【问题描述】:

对于学校,我需要用 C# 制作一个项目,该项目将随机提出 20 个问题。

我有一个包含问题和答案的文本文件。

通过一些代码,我们将问题放在一个数组中。现在我们可以生成一个从 0 到 19 的数字(20 个问题)。但每个问题只需要出现 1 次且仅出现 1 次。

我们不能随机做第一个,然后按顺序做第二个。每个问题都需要随机。

我的代码(荷兰语):

public int randomVraagMaker()
    {

        int num;
        Random randNum = new Random();
        num = randNum.Next(0, 19);
        for (int i = 0; i < lijst.Count; i++) 
        {
            if (num == lijst[i])
            {
                num = randNum.Next(0, 19);
            }
            else
                lijst.Add(num);

        }
        vraag = num * 7;
        return vraag;

【问题讨论】:

  • 如果您有具体问题,可以在这里提问。但是,我们不会为您做作业。
  • 这里有个提示:获取列表中的问题,然后随机排列列表的顺序。
  • 或者,当您选择随机问题时,将其从列表中删除。不过,请确保您的下一个随机数仅达到列表的长度。
  • Randomize a List<T> in C# 的可能重复项
  • 从你认为你需要的事情中退后一步,看看你真正想做的事情。您希望以随机顺序获得 20 个问题,没有重复。那是洗牌。 @Silvermind 链接的答案告诉您如何在 C# 中进行洗牌。

标签: c# random numbers unique


【解决方案1】:

你可以建立一个所有问题的列表,然后随机删除你想问的问题:

// Using a List<string> questions or List<int> of indices

T RemoveSingleQuestion<T>(List<T> questions, Random random)
{
     // TODO: Add validation (ie: questions is not null, has at least 1 element, etc)
     int index = random.Next(questions.Count);
     T question = questions[index];
     questions.RemoveAt(index);
     return question;
}

通过这种方式,您可以构建(包含任意数量的问题)列表,并在进行过程中删除您提出的问题。

【讨论】:

  • 嘿,我该怎么做才能得到一个 int 来返回?
  • @user3574537 相同的方式 - 只需构建 int 列表,然后从集合中返回 int。我将进行编辑以展示如何使其适用于任何 List
【解决方案2】:

我不会为你做功课,但也许可以试着用一张纸和一个给出 1 到 20 数字的骰子来思考如何解决这个问题。 你可以这样做

  1. 掷骰子
  2. 如果该号码未被使用,请提出问题并将其从列表中划掉
  3. 如果号码已被使用,再次滚动

【讨论】:

  • 嘿,哈哈哈我已经用代码填了8篇论文了,我真的很困惑。
【解决方案3】:

我不会给你答案,因为这是家庭作业,但是,你要做的是创建一个整数列表:

List<int> _usedNumbers = new List<int>();

然后将您生成的每个随机数添加到列表中。最后,选择您的随机数后,检查它是否在您的列表中:

if (_usedNumbers.Contains(myRandomNumber))
{
    // Number is not unique. Try generating another random number
} else {
    // Number IS unique!
}

我正在给你一个如何做的想法。实际上,您可能希望使用while 循环来不断获取一个随机数,直到您得到一个不在列表中的数字。

【讨论】:

  • 嘿,这就是我现在基本拥有的。但由于某种原因,这行不通
  • if (_usedNumbers.Contains(myRandomNumber)) { myRandomNumber = randNum.Next(0, 19); } else { return myRandomNumber _usedNubers.add(myRandomNumber) } 我知道这通常需要工作,但它没有
  • 如果它在列表中,您正在选择一个新的随机数,但是,如果您选择的新随机数也在列表中怎么办?你又检查了吗?然后再次?它需要在while 循环中。类似while (_usedNumbers.Contains(myRandomNumber)) { myRandomNumber = randNum.Next(0,19); }
  • 确保在问完所有问题后就停下来。否则你会创建一个无限循环。
  • 是的 :D 用一个基本的计数器来处理
【解决方案4】:

我不会得到一个随机数,然后得到这个数字的问题,这就是我要做的......

将所有问题放入一个数组中,然后随机化(或打乱)数组。这应该很容易做到。一旦你有一个洗牌的数组,它可能看起来像:

18, 4, 6, 19, 1, [...] 

当您需要答案时,请选择最前面(或下一个索引)的答案。每个问题都保证在您完成阵列时出现一次且仅出现一次。

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 2013-08-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多