【问题标题】:Random name picker without duplication? [duplicate]没有重复的随机名称选择器? [复制]
【发布时间】:2019-01-07 12:25:12
【问题描述】:

我正在从指定列表创建一个简单的名称选择器。我应该如何修改它,使其不会重复已经“挑选”的名称?

static void Main(string[] args)
{

    string[] Names = { "Erik", "Levente", "Noel", "Áron", "Krisztián", "Kristóf", "Bence", "Roland", "Máté", "László", "Bálint" ,
    "Regina", "Brigitta", "Gréta", "Hédi", "Hanna", "Boglárka", "Jázmin", "Réka", "Alexandra", "Rebeka", "Lili", "Luca", "Zsófi"};

    Random rnd2 = new Random();
    Console.WriteLine("Az ID : '1' eszköz nyertese: " + Names[rnd2.Next(0, Names.Length - 1)]);

    Random rnd3 = new Random();
    Console.WriteLine("Az ID : '2' eszköz nyertese: " + Names[rnd2.Next(0, Names.Length - 1)]);

    Random rnd4 = new Random();
    Console.WriteLine("Az ID : '3' eszköz nyertese: " + Names[rnd2.Next(0, Names.Length - 1)]);

    Random rnd5 = new Random();
    Console.WriteLine("Az ID : '4' eszköz nyertese: " + Names[rnd2.Next(0, Names.Length - 1)]);

    Random rnd6 = new Random();
    Console.WriteLine("Az ID : '5' eszköz nyertese: " + Names[rnd2.Next(0, Names.Length - 1)]);

    Random rnd7 = new Random();
    Console.WriteLine("Az ID : '6' eszköz nyertese: " + Names[rnd2.Next(0, Names.Length - 1)]);


    Console.ReadKey(true);
}

【问题讨论】:

  • 不要创建Random 类的多个实例。一个实例就足够了!
  • 尝试先用google找答案。这回答了好几次

标签: c# random draw


【解决方案1】:

您可以通过将已使用的内容存储在 List<string> 中来确保没有重复项,例如:

string[] names = new string[] { "bob", "james", "tim", "amanda", "lisa" }
List<string> alreadyUsed = new List<string>();
Random r = new Random();
while (alreadyUsed.Count < names.Length) {
    int index = r.Next(0, names.Length);
    if (!alreadyUsed.Contains(names[index])) {
        alreadyUsed.Add(names[index]);
        Console.WriteLine($"{names[index]} was added.");
    }
}

【讨论】:

  • 为什么要List,什么时候HashSet更合适?
  • List 是更常见的 IMO;在 12 年的开发中,我实际上从未使用过HashSet。我确信它有它的用途,所以我一定会研究它。
  • @davisj1691:嗯,它有它的用途,例如这里。总是在您需要存储唯一值以及想要快速查找时,即使列表非常大。它只是不允许随机访问,它不是有序的。因此,当您觉得只需要带有键的字典时,HashSet&lt;T&gt; 就是您的类,当您需要通过索引访问项目或需要允许重复的有序集合时,请使用 List&lt;T&gt;(或数组)。
  • @TimSchmelter 非常好的信息,这实际上可能有助于解决同事一直存在的性能问题。我推荐了Parallel.ForEach,它确实有助于将处理时间减少 35%(约 3 分钟)。这也可能对他相当大的数据集有所帮助。
  • 您提出的关于性能的观点对于嵌套循环来说是一个好主意,但我认为对于 OP 的问题,单个循环就足够了吗?
猜你喜欢
  • 2021-10-05
  • 2018-07-25
  • 2017-10-25
  • 2019-05-05
  • 2016-10-08
  • 2021-06-16
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多