C# 根据指定的条件C从列表中选择随机数

C# 根据指定的条件C从列表中选择随机数,c#,arrays,random,unique,C#,Arrays,Random,Unique,我试图从列表中生成一个唯一的随机数。用户将在此处输入以下内容: 所需的随机数 编号C1、C2和C3项目。 示例:10个带有C1-5、C2-4和C3-1的随机数 因此,根据这些条件,需要生成一个随机数列表 我的清单是这样的 1 C1 2 C2 3 C3 4 C3 5 C2 6 C1 7 C2 8 C3 9 C1 10 C2 11 C1 12 C3 13 C3 14 C1 15 C2 16 C2 17 C4 18 C3 19 C4 20 C4

我试图从列表中生成一个唯一的随机数。用户将在此处输入以下内容:

所需的随机数 编号C1、C2和C3项目。 示例:10个带有C1-5、C2-4和C3-1的随机数

因此,根据这些条件,需要生成一个随机数列表

我的清单是这样的

1 C1 2 C2 3 C3 4 C3 5 C2 6 C1 7 C2 8 C3 9 C1 10 C2 11 C1 12 C3 13 C3 14 C1 15 C2 16 C2 17 C4 18 C3 19 C4 20 C4 21 C4 22 C1 23 C2 24 C3 25 C4 26 C3 27 C4 我的代码如下所示:

protected void BtnGenerate_Click(object sender, EventArgs e)
{
            List<string> labels; // Holds all Labels (unique)
            List<string> values; // Holds all numbers of labels
            Random r = new Random();
            StringBuilder sb=new StringBuilder(100);

            sb.Clear();
            var randoms = values.OrderBy(x => r.Next()).Take(Convert.ToInt16(txtNumberOfRandomNumbers.Text));
            foreach (var item in randoms)
            {
                sb.Append(item.ToString() + ",");
            }

            lblRandomNumbers.Text = sb.ToString().Remove(sb.ToString().LastIndexOf(","));
}
我一直在研究如何将这些条件添加到随机函数中。请在这方面帮助我。

我建议生成所需的项目,然后重新排列集合,例如:

// Simplest, but not thread safe
static Random s_Gen = new Random();

private static string Solution(int all, int c1, int c2, int c3) {
  return string.Join(",", new[] {
    Enumerable.Repeat("C1", c1),
    Enumerable.Repeat("C2", c2),
    Enumerable.Repeat("C3", c3),
    Enumerable.Repeat("C4", all - c1 - c2 - c3), }
  .SelectMany(item => item)
  .OrderBy(item => s_Gen.NextDouble()));  
}

protected void BtnGenerate_Click(object sender, EventArgs e) {
  lblRandomNumbers.Text = Solution(27, 10, 5, 3);
}
请尝试以下操作:

List<string> input = new string[] { "C1", "C1", "C1", "C1", "C1", "C1", "C2", "C2", "C2", "C2", "C2", "C2", "C2", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C4", "C4", "C4", "C4", "C4", "C4" }.ToList();

Random rand = new Random();

List<string> output = input.Select(x => new { number = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.number).ToList();

使用随机循环方法..我喜欢返回一个本地字符串而不是Linq查询,这样E&C就可以在方法内部进行调试,而不必调用它来获得结果。除了一个变量的额外开销之外,还有什么原因让你更喜欢直接回报吗?@Jeremy Thompson:我明白了,在很多情况下,你的建议var data=/*。。。林克…*/;返回字符串。Join,,data;更具可读性,更易于维护/调试。然而,查询本身非常简单,事实上OrderBy很重要,这就是为什么我认为我有权将Linq和Join结合在一起